前言
這一篇就來記錄一下讀取文本文件並使用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)
