python .txt文件读取及数据处理总结

python .txt文件读取及数据处理总结1、处理包含数据的文件最近利用Python读取txt文件时遇到了一个小问题,就是在计算两个np.narray()类型的数组时,出现了以下错误:TypeError:ufunc’subtract’didnotcontainaloopwithsignaturematchingtypesdtype(‘

大家好,又见面了,我是你们的朋友全栈君。

##1、处理包含数据的文件
最近利用Python读取txt文件时遇到了一个小问题,就是在计算两个np.narray()类型的数组时,出现了以下错误:

 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文件中:

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文件中:

#__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.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.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中包含的前面列出的字符,并用空白替换:

lineString = re.sub("[\n\.\!\/_\-$%^*(+\"\')]+|[+—()?【】“”!:,;.?、~@#¥%…&*()0123456789]+", " ", lines)

###2.2 python对多文件的操作
下面的程序中,pathDirPos指的是所有积极评论的txt文件所在的目录,在此指的是“F:\Self_Learning\机器学习\python\Bayes\review_polarity\txt_sentoken\pos”。child就是获得的每个txt文件全名。

 for allDir in pathDirPos:
        child = os.path.join('%s' % allDir)

###2.3 电影评论数据集预处理
下面给出对于电影评论数据集的预处理程序(python3.6).


'''获取数据,并去除数据中的多余符号,返回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
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/139278.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python中encode和decode的区别_python isalpha

    python中encode和decode的区别_python isalpha在python中,我们通常使用的是unicode编码,但是日常文本使用各类编码为utf-8,编码的类型不一样,就容易造成乱码。为了避免读写操错误,我们需要进行转码则需要decode(解码)和encode(编码)方法。1、decode的作用是将其他编码的字符串转换成unicode编码将bytes类型转换为str类型(b.decode())2、encode的作用是将unicode编码转换成…

    2022年10月6日
    6
  • 去除字符串中的双引号「建议收藏」

    去除字符串中的双引号「建议收藏」str为“123”如果一个双引号:str1=str.replace(“\””,””).replace(“\””,””);如果不确定有多少个双引号:str2=str.replace(/\”/g,””);此方法为替换,也可用于去除制定字符,如:Stringstr=”12/3″;str1=str.replace(“\/”,””);str2=str.replace(/\//g,

    2022年5月23日
    52
  • mac 亿图11 激活码-激活码分享

    (mac 亿图11 激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月27日
    623
  • SSH学习过程

    SSH学习过程学习之struts2:2013年4月24日struts2的练习项目基本完成,还存在部分疑问。     时值五月,开始学习hibernate,希望继续努力~

    2022年6月24日
    37
  • c++入门教程–-5判断语句

    c++入门教程–-5判断语句

    2021年3月12日
    244
  • 2021Java高级面试题及答案,太牛了!

    2021Java高级面试题及答案,太牛了!什么是RPC?RPC原理是什么?什么是RPC?RPC(RemoteProcedureCall)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。比如两个不同的服务A、B部署在两台不同的机器上,那么服务A如果想要调用服务B中的某个方法该怎么办呢?使用HTTP请求当然可以,但是可能会比较慢而且一些优化做的并不好。RPC的出现就是为了解决这个问题。RPC原理是什么?服务消费方(client)调用以本地调用方式调用服务;client

    2022年7月18日
    21

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号