環境:python3.6
庫:jieba,xlwt,xlwings,collections
前兩天有個需求要對一張表裏的中文語句進行分詞,並統計每個詞語出現的次數。
表格1231.xlsx大致內容如下:
由於表格內容過大,約有100W條數據,普通讀取表格的方式效率非常慢,所以這次用的方法是xlwings,
xlwings是目前看來操作excel最快速、做的比較完善的一個庫,優化很好,調用方式非常靈活。對讀取大表格的有很高的效率
以下是完整的代碼:
import jieba
import xlwt, xlrd
import xlwings as xw
from collections import Counter
# 定義一個空列表
all_word_list = []
# 分詞
def trans_CN(text):
# 接收分詞的字符串
word_list = jieba.cut(text)
# 分詞後在單獨個體之間加上空格
result = " ".join(word_list)
# 轉換成list
result = result.split(" ")
return result
# 判斷詞是否爲中文
def is_Chinese(word):
for ch in word:
if '\u4e00' <= ch <= '\u9fff':
return True
return False
start_row = 2 # 處理Excel文件開始行
end_row = 1000000 # 處理Excel結束行
# 指定不顯示地打開Excel,讀取Excel文件
app = xw.App(visible=False, add_book=False)
wb = app.books.open(r"./1231.xlsx") # 打開Excel文件
sheet = wb.sheets[9] # 選擇第0個表單
# 讀取Excel表單前1000000行的數據,讀取Excel表單前1000000行的數據
for row in range(start_row, end_row):
print(row)
row_str = str(row)
# 循環中引用Excel的sheet和range的對象,讀取C列的每一行的值
content_text = sheet.range('C' + row_str).value
# print(content_text)
if not content_text:
continue
if not isinstance(content_text, str):
continue
# 長度小於4的語句 過濾
if len(content_text) > 3:
word_list = trans_CN(content_text)
print("分詞後", word_list)
# 判斷列表元素是否爲中文,將非中文詞移除
for s in word_list:
if not is_Chinese(s):
word_list.remove(s)
all_word_list += word_list
# 統計列表中元素出現的頻率
counter = Counter(all_word_list)
print("統計頻率完成")
# 將列表中的元素按照頻率大小排序
result_list = sorted(counter.items(), key=lambda x: x[1], reverse=True)
# 將結果寫入表格
print("開始寫入表格")
myWorkbook = xlwt.Workbook()
mySheet = myWorkbook.add_sheet('Sheet1', cell_overwrite_ok=True)
rows = 0
for i in result_list:
mySheet.write(rows, 0, i[0])
mySheet.write(rows, 1, i[1])
rows += 1
myWorkbook.save('result.xls')
# 保存並關閉Excel文件
wb.save()
wb.close()
運行完成後,保存爲result.xls,查看結果:
A列爲分詞,B列爲該詞出現的次數