1、处理包含数据的文件
最近利用python读取txt文件时遇到了一个小问题,就是在计算两个np.narray()类型的数组时,出现了以下错误:
1
|
typeerror: ufunc 'subtract' did not contain a loop with signature matching types dtype( '<u3' ) dtype( '<u3' ) dtype( '<u3' )
|
作为一个python新手,遇到这个问题后花费了挺多时间,在网上找了许多大神们写的例子,最后终于解决了。
总结如下:
(1)出现此问题的原因是:目的是想计算两个数组间的差值,但数组中的元素不是数据类型(float或int等),而是str类型的。
(2)解决方法:在为空数组添加数据过程中,将每个数据强制转化为float型。
如将“character.append(dataset[i][:-1])”修改为“ character.append([float(tk) for tk in dataset[i][:-1]])”
现将利用python读取txt文件的过程总结如下:
python版本为python3.6
(1)函数定义,存放于function.py文件中:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
from numpy import *
import random
#读取数据函数,返回list类型的训练数据集和测试数据集
def loaddata(filename):
trainingdata = []
testdata = []
with open (filename) as txtdata:
lines = txtdata.readlines()
for line in lines:
linedata = line.strip().split( ',' ) #去除空白和逗号“,”
if random.random()< 0.7 : #数据集分割比例
trainingdata.append(linedata) #训练数据集
else :
testdata.append(linedata) #测试数据集
return trainingdata,testdata
#输入数据为list类型,分割数据集,分割为特征和标签两部分,返回数据为np.narray类型
def splitdata(dataset):
character = []
label = []
for i in range ( len (dataset)):
character.append([ float (tk) for tk in dataset[i][: - 1 ]])
label.append(dataset[i][ - 1 ])
return array(character),array(label)
|
(2)实现两个数组间的减法,存放于main.py文件中:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#__author__=='qustl_000'
#-*- coding: utf-8 -*-
import numpy as np
import function
filename = "1.txt"
trainingdata,testdata = function.loaddata(filename)
trainingcharacter,traininglabel = function.splitdata(trainingdata)
testcharacter,testlabel = function.splitdata(testdata)
diff1 = np.tile(testcharacter[ 0 ],( len (trainingcharacter), 1 )) - trainingcharacter
print ( '测试数据集的一条数据,扩充到与训练数据集同维:' )
print (np.tile(testcharacter[ 0 ],( len (trainingcharacter), 1 )))
print ( '训练数据集:' )
print (trainingcharacter)
print ( '作差后的结果:' )
print (diff1)
|
(3)运行结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
测试数据集的一条数据,扩充到与训练数据集同维:
[[ 1.5 60. ]
[ 1.5 60. ]
[ 1.5 60. ]
[ 1.5 60. ]
[ 1.5 60. ]
[ 1.5 60. ]
[ 1.5 60. ]
[ 1.5 60. ]
[ 1.5 60. ]
[ 1.5 60. ]
[ 1.5 60. ]
[ 1.5 60. ]
[ 1.5 60. ]]
训练数据集:
[[ 1.5 40. ]
[ 1.5 50. ]
[ 1.6 40. ]
[ 1.6 50. ]
[ 1.6 60. ]
[ 1.6 70. ]
[ 1.7 60. ]
[ 1.7 70. ]
[ 1.7 80. ]
[ 1.8 60. ]
[ 1.8 80. ]
[ 1.8 90. ]
[ 1.9 90. ]]
作差后的结果:
[[ 0. 20. ]
[ 0. 10. ]
[ - 0.1 20. ]
[ - 0.1 10. ]
[ - 0.1 0. ]
[ - 0.1 - 10. ]
[ - 0.2 0. ]
[ - 0.2 - 10. ]
[ - 0.2 - 20. ]
[ - 0.3 0. ]
[ - 0.3 - 20. ]
[ - 0.3 - 30. ]
[ - 0.4 - 30. ]]
|
数据集如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
1.5 , 40 ,thin
1.5 , 50 ,fat
1.5 , 60 ,fat
1.6 , 40 ,thin
1.6 , 50 ,thin
1.6 , 60 ,fat
1.6 , 70 ,fat
1.7 , 50 ,thin
1.7 , 60 ,thin
1.7 , 70 ,fat
1.7 , 80 ,fat
1.8 , 60 ,thin
1.8 , 70 ,thin
1.8 , 80 ,fat
1.8 , 90 ,fat
1.9 , 80 ,thin
1.9 , 90 ,fat
|
2、处理文本文件,如情感识别类的文件
在进行文本的情感分类时,从电影评论数据集网站上下载数据集后,发现数据集中存在许多不需要的符号。截取部分包含多余字符的数据如下:
下载数据集后,所有txt文件存放在两个文件夹:“neg”(包含消极评论)和“pos”(包含积极地评论)中。
两者的存放目录如下:“f:\self_learning\机器学习\python\bayes\review_polarity\txt_sentoken”。后面需要用到文件路径,此路径可根据自己存放目录修改。
主要涉及到的python操作有:多余字符的删除、文件夹中多文件的操作。
2.1 多余字符的删除
首先,我们要删除多余的符号,获得干净的数据。
经过查找资料,知道删除一条文本数据中不需要的符号,可以通过re.sub(chara,newchara,data)函数实现,其中chara是需要删除的字符,newchara是删除字符后相应位置的替换字符,data是需要操作的数据。比如下面的代码,指的是删除lines中包含的前面列出的字符,并用空白替换:
1
|
linestring = re.sub( "[\n\.\!\/_\-$%^*(+\"\')]+|[+—()?【】“”!:,;.?、~@#¥%…&*()0123456789]+" , " " , lines)
|
2.2 python对多文件的操作
下面的程序中,pathdirpos指的是所有积极评论的txt文件所在的目录,在此指的是“f:\self_learning\机器学习\python\bayes\review_polarity\txt_sentoken\pos”。child就是获得的每个txt文件全名。
1
2
|
for alldir in pathdirpos:
child = os.path.join( '%s' % alldir)
|
2.3 电影评论数据集预处理
下面给出对于电影评论数据集的预处理程序(python3.6).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
'''获取数据,并去除数据中的多余符号,返回list类型的数据集'''
def loaddata(pathdirpos,pathdirneg):
posalldata = [] # 积极评论
negalldata = [] # 消极评论
# 积极评论
for alldir in pathdirpos:
linedatapos = []
child = os.path.join( '%s' % alldir)
filename = r "review_polarity/txt_sentoken/pos/" + child
with open (filename) as childfile:
for lines in childfile:
linestring = re.sub( "[\n\.\!\/_\-$%^*(+\"\')]+|[+—()?【】“”!:,;.?、~@#¥%…&*()0123456789]+" , " " , lines)
line = linestring.split( ' ' ) #用空白分割每个文件中的数据集(此时还包含许多空白字符)
for strc in line:
if strc ! = "" and len (strc) > 1 : #删除空白字符,并筛选出长度大于1的单词
linedatapos.append(strc)
posalldata.append(linedatapos)
# 消极评论
for alldir in pathdirneg:
linedataneg = []
child = os.path.join( '%s' % alldir)
filename = r "review_polarity/txt_sentoken/neg/" + child
with open (filename) as childfile:
for lines in childfile:
linestring = re.sub( "[\n\.\!\/_\-$%^*(+\"\')]+|[+—()?【】“”!:,;.?、~@#¥%…&*()0123456789]+" , " " , lines)
line = linestring.split( ' ' ) #用空白分割每个文件中的数据集(此时还包含许多空白字符)
for strc in line:
if strc ! = "" and len (strc) > 1 : #删除空白字符,并筛选出长度大于1的单词
linedataneg.append(strc)
negalldata.append(linedataneg)
return posalldata,negalldata
'''划分数据集,将数据集划分为训练数据和测试数据,参数splitpara为分割比例'''
def splitdataset(pathdirpos,pathdirneg,splitpara):
trainingdata = []
testdata = []
trainglabel = []
testlabel = []
posdata,negdata = loaddata(pathdirpos,pathdirneg)
pos_len = len (posdata)
neg_len = len (negdata)
#操作积极评论数据
for i in range (pos_len):
if (random.random()<splitpara):
trainingdata.append(posdata[i])
trainglabel.append( 1 )
else :
testdata.append(posdata[i])
testlabel.append( 1 )
for j in range (neg_len):
if (random.random()<splitpara):
trainingdata.append(negdata[j])
trainglabel.append( 0 )
else :
testdata.append(negdata[j])
testlabel.append( 0 )
return trainingdata,trainglabel,testdata,testlabel
|
以上这篇对python .txt文件读取及数据处理方法总结就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/weixin_38215395/article/details/78679296