前言
这一篇就来记录一下读取文本文件并使用Jieba包进行分词,存储结果用于后续处理的一些简单操作~
分词并存储
话不多说,简单步骤就是构建好自己的词典和停用词列表,然后读取 分词 删除 存储
import jieba
import pandas as pd
def read_file(filename):
"""读取文本数据,删除停用词 将文本及其对应的故障类型存储为列表"""
contents, labels = [], []
jieba.load_userdict('data/词典.txt')
data = pd.read_excel('data/停用词.xlsx', header=None)
df = pd.DataFrame(data)
stopword = df[0].tolist()
with open(filename, encoding='utf-8') as f:
i = 0
for line in f:
i = i + 1
try:
label, content = line.strip().split('\t')
content = "".join(content)
if content:
sent = jieba.cut(content) # 词语分割
sentend = []
for word in sent:
if word not in stopword:
sentend.append(word)
sentend = list_filter_number(sentend)
contents.append(sentend)
labels.append(label)
# print(sentend)
# print(label)
else:
print('第', i, '篇文本删除停用词后没有词语')
print(content)
except:
print(line, '内容无法被识别')
print(i,'行内容有问题')
return contents, labels
调用上述函数可以得到文本词语列表和它对应的类型(这个和文本特点有关)
在使用改代码进行读取时,默认文本排列方式是:类型(Tab)内容
所以有一个label 大家根据需要选择就好啦 微微改动即可~
最后返回的是文本类型和和文本内容
下边这个函数用来对文本中出现的数字和空格进行筛选
def list_filter_number(l):
"""
去除列表中的数字和空格
:param l: 待过滤列表
:return: 已过滤数字列表
"""
m = [i for i in l if (i != '') or (i != ' ')]
return list(filter(lambda x: not str(x).isdigit(), m))
代码函数分析
在上述步骤中,要对一些具备一点功能的函数进行介绍啦~
strip split
line.strip().split(',')
strip()表示删除数据中的换行符,split(',')是数据中遇到,就隔开
判断字符串中是否包含空格:s.isspace()
删除字符串中的空白字符:s.strip(m) 删除s开头结尾的rm
s.lstrip(m) 删除s开头的rm
s.rstrip(m) 删除s结尾的rm
当rm为空时,默认删除空白字符,包括\n \r \t
\t代表制表符 \n代表换行符 \r表示回车
.join()
连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分割符)连接形成一个新的字符串
' '.join(a)
os.walk
os.walk(top, topdown=True, onerror=None, followlinks=False) # 可以得到一个三元组tupple(dirpath, dirnames, filenames) # 第一个为起始路径,第二个为起始路径下的文件夹,第三个是起始路径下的文件
dirpath时一个string,代表目录的路径
dirnames是一个list,包含了dirpath下的所有子目录的名字
filenames是一个list,包含了非目录文件的名字
这些名字不包含路径信息,如果需要得到全路径,需要使用os.path.join(dirpath,name)
os.listdir()
返回指定文件夹包含的文件或文件夹的名字列表,如果目录名字为中文,在输入之前需要转码
upath = unicode(cpath,;utf-8) for filename in os.listdir(uPath): print(filename)
只支持在Unix,Windows下使用
这两个函数在你有很多文件需要读取,文件名字有特点时可以使用。
强烈提醒
在读取数据和文件的时候,一定要注意出现那种什么都没有或者格式问题导致程序报错的现象。
一定要学会错误捕捉!!!!!
要不然你就会发现自己的代码明明没错 总是出不了结果。尽管它只是这么短的一段小代码(虽然现在的我只会try except)