Python可視化單詞統(tǒng)計詞頻統(tǒng)計中文分詞的實現(xiàn)步驟
可視化單詞統(tǒng)計詞頻統(tǒng)計中文分詞
項目架構
新建一個文件,輸入文件的內容,查詢此文件中關鍵字的出現(xiàn)的次數(shù),關鍵字出現(xiàn)的位置,將所有的文本按照中文分詞的詞庫進行切割劃分,返回JSON字符串,返回中文切分的單詞和出現(xiàn)的頻次,最后關閉程序

新建文件
新建指定文本文件,輸入一個文件名,以及里面的文件內容建立一個文本文件。通過GUI的Entry控件實現(xiàn)一個文本框text1,作用是用來接收用戶輸入的文件名。
content1用來存儲文件名,如果輸入的文件名為空就彈出窗體顯示“文件名不為空!”的提示,content2用來存儲文件內容文件名有效則通過open()函數(shù)以讀文件的方式打開文件。
然后使用write()將輸入的文件內容寫入新建好的文件中,點擊新建文件按鈕,彈出提示框“文件建立成功”,完成后close關閉文件。

輸入文件名,輸入一段內容,點擊新建文件,成功建立文件

單詞計數(shù)
給定單詞計數(shù),輸入一個不含空格的單詞,統(tǒng)計輸出該單詞在文本中的出現(xiàn)次數(shù)。通過GUI的Entry控件實現(xiàn)一個文本框text1,作用是用來接收用戶輸入的文件名。content1用來存儲文件名,如果輸入的文件名為空就彈出窗體顯示“文件名不為空!”的提示。
文件名有效則通過open()函數(shù)以讀文件的方式打開文件。Entry控件實現(xiàn)一個文本框text3,作用是用來接收用戶輸入要查詢的目標單詞,count = 0 將計數(shù)器初始化為0。
利用了模式匹配算法:循環(huán)讀入文件,每次讀入一行,逐行掃描文本文件,利用strip()去掉每行頭尾空白字符,一行調用count(keyword)函數(shù)匹配到目標單詞返回目標單詞出現(xiàn)的次數(shù)count函數(shù)封裝了字符串匹配,目標串P的長度為m,主串T的長度是n,枚舉主串T中每一個位置i, 然后檢查T[i,i+m-1]是否與目標串P完全相同,相同的就將count加一,i加一,繼續(xù)往后匹配子串。
如果不同,就只將i加一,繼續(xù)往后匹配子串。直到整行結束。存儲下當前行目標單詞出現(xiàn)的次數(shù),再遍歷下一行。直到整個文件掃描結束;然后輸出文件中單詞出現(xiàn)的總次數(shù)。并且關閉文件。

全文單詞索引
查找給定單詞在文件中的位置。定義content1接收text1的值,content3接收text3的值,content1用來接收用戶輸入的文件名,如果輸入文件名為空就彈出窗體顯示“文件名不能為空!”的提示。
文件名有效則通過open()函數(shù)以讀文件的方式打開文件,content3用來接收用戶所輸入需查詢的單詞;使用for循環(huán)逐行進行檢索,先判斷輸入文件名是否為空,為空則彈出錯誤對話框,并提示“文件名不能為空!”。
不為空則使用open()打開文件,row初始化為1,再判斷文件內容是否為空,為空則row+1且跳出此層循環(huán),不為空則使用for循環(huán)檢索出用戶指定單詞的位置與出現(xiàn)次數(shù)并輸出第x行n次。

中文分詞統(tǒng)計詞頻
導入jieba第三方中文分詞函數(shù)庫,lcut(text),精確模式,返回text分詞后的列表變量使用函數(shù)lcut()進行文本處理時,英文文本的分詞只需要通過空格就可以分割。而中文的文本是需要一個“詞典”來實現(xiàn)分詞jieba第三方庫實現(xiàn)了“詞典” 采取了精確模式,試圖將句子最精確地切開。
words = jieba.lcut(text)將文本的分詞實現(xiàn)切分后,返回一個分詞的列表words定義counts 的空字典循環(huán)遍歷分詞列表,分詞的長度為1 就繼續(xù)遍歷,否則就進行統(tǒng)計分詞出現(xiàn)的次數(shù)。每一個分詞作為字典中的鍵,出現(xiàn)的次數(shù)作為字典中的值counts[word] = counts.get(word, 0) + 1鍵值的添加,獲得文件中相同字符出現(xiàn)的次數(shù)有word這個分詞時,時返回其值,默認是0,+1能夠累計次數(shù);沒有word時則返回0。
counts.items()字典鍵值對,list()轉化為列表賦值給items,列表items進行按照鍵從小到大的順序進行排序,在dict轉化為字典輸出,輸出后關閉文件。

最后將查詢的所有結果都追加到輸出文件中

源代碼
import tkinter as tk
from tkinter import messagebox, END, RIDGE
import jieba
root = tk.Tk()
root.title("單詞檢索統(tǒng)計系統(tǒng)")
root.resizable(False, False)
root.geometry('450x400')
root.configure(bg='white')
# 新建文件
def fun1():
content1 = text1.get()
content2 = text2.get('1.0', END)
if content1 == '':
messagebox.showerror(title='Error', message='文件名不為空!')
else:
file = open(r'D:\圖庫\183\pythonProject\com\mao\\' + content1 + '.txt', 'w', encoding='GBK')
file.writelines(content2)
file.write('\n')
messagebox.showinfo(title='Success', message='新建成功!')
file.close()
# 單詞的統(tǒng)計
def fun2():
content1 = text1.get()
content3 = text3.get()
if content1 == '':
messagebox.showerror(title='Error', message='文件名不為空!')
else:
try:
file = open(r'D:\圖庫\183\pythonProject\com\mao\\' + content1 + '.txt', 'r')
if content3 != '':
count = 0
# 計數(shù)器初始化為0
for line in file.readlines():
line = line.strip()
# 依次讀取每行, 去掉每行頭尾空白
count += line.count(content3)
# 逐行累加計數(shù)
if count == 0:
messagebox.showerror(title='Error', message='沒有此單詞!')
else:
text4.insert(tk.END, '共有 ' + str(count) + ' 個 ' + content3 + '\n')
with open(r"D:\圖庫\183\pythonProject\com\mao\text.txt", "a") as output:
output.write('共有 ' + str(count) + ' 個 ' + content3 + '\n')
file.close()
else:
messagebox.showerror(title='Error', message='查詢目標單詞不為空!')
except Exception as e:
messagebox.showerror(title='Error', message=e)
# 單詞的定位
def fun3():
content1 = text1.get()
content3 = text3.get()
if content1 == '':
messagebox.showerror(title='Error', message='文件名不為空!')
else:
try:
file = open(r'D:\圖庫\183\pythonProject\com\mao\\' + content1 + '.txt', 'r')
row = 1
# 行初始化為1
for line in file.readlines():
# 檢索每一行
if content3 == '':
messagebox.showerror(title='Error', message='查詢目標單詞不為空!')
break
else:
if line.count(content3):
# 每一行目標單詞出現(xiàn)的次數(shù)
text4.insert(tk.END, '\n第' + str(row) + '行,' + str(line.count(content3)) + '次')
with open(r"D:\圖庫\183\pythonProject\com\mao\text.txt", "a") as output:
output.write('\n第' + str(row) + '行,' + str(line.count(content3)) + '次')
index_list = []
# 建立索引列表
index = line.find(content3)
# 找到單詞所在的位置:索引號
while index != -1:
# 判斷索引是否結束,并將查找到的索引號添加到索引列表中
index_list.append(index)
index = line.find(content3, index + 1)
# 下標下一位開始,找到word之后添加到列表中
text4.insert(tk.END, '\n相應位置在:')
for index in index_list:
# 遍歷索引列表并輸出
text4.insert(tk.END, str(index + 1) + ' ')
text4.insert(tk.END, '\n')
row += 1
else:
# 無法查詢到單詞,沒有目標單詞的行輸出此行沒有找到,進入下一行繼續(xù)查找
row += 1
continue
fun2()
except Exception as e:
messagebox.showerror(title='Error', message=e)
# 分詞統(tǒng)計
def sign4():
content1 = text1.get()
def read(path):
if path == '':
messagebox.showerror(title='Error', message='文件名不為空!')
else:
try:
text = open(r'D:\圖庫\183\pythonProject\com\mao\\' + path + '.txt', 'r')
content = text.read()
words = jieba.lcut(content)
counts = {}
for word in words:
if len(word) == 1:
continue
else:
counts[word] = counts.get(word, 0) + 1
items = list(counts.items())
items.sort(key=lambda x: x[1], reverse=True)
counts = dict(items)
text4.insert(tk.END, counts)
with open(r"D:\圖庫\183\pythonProject\com\mao\text.txt", "a") as output:
output.write(str(counts))
text.close()
except Exception as e:
messagebox.showerror(title='Error', message=e)
read(content1)
# 頁面布局
button1 = tk.Button(root, text='新建文件', bg='pink', font=('微軟雅黑', 15), relief=RIDGE, command=fun1)
button1.place(x=0, y=0, width=100, height=80)
label1 = tk.Label(root, text='文件名:', font=('微軟雅黑', 15), )
label1.grid(padx=100)
text1 = tk.Entry(root, font=('MingLiU', 13))
text1.place(x=200, width=200, height=40)
label2 = tk.Label(root, text='文件內容:', font=('微軟雅黑', 15))
label2.grid(pady=25)
text2 = tk.Text(root)
text2.place(x=200, y=45, width=200, height=40)
button2 = tk.Button(root, text='單詞計數(shù)', bg='pink', font=('微軟雅黑', 15), relief=RIDGE, command=fun2)
button2.place(x=0, y=80, width=100, height=80)
button3 = tk.Button(root, text='單詞定位', bg='pink', font=('微軟雅黑', 15), relief=RIDGE, command=fun3)
button3.place(x=0, y=160, width=100, height=80)
button4 = tk.Button(root, text='分詞統(tǒng)計', bg='pink', font=('微軟雅黑', 15), relief=RIDGE, command=sign4)
button4.place(x=0, y=240, width=100, height=80)
label3 = tk.Label(root, text='查詢目標:', font=('微軟雅黑', 15))
label3.grid(padx=100)
text3 = tk.Entry(root, font=('MingLiU', 13))
text3.place(x=200, y=90, width=200, height=58)
label4 = tk.Label(root, text='查詢結果:', font=('微軟雅黑', 15))
label4.grid(pady=75)
text4 = tk.Text(root, font=('楷體', 13))
text4.place(x=200, y=160, width=200, height=200)
button5 = tk.Button(root, text='退出程序', bg='pink', font=('微軟雅黑', 15), relief=RIDGE, command=root.destroy)
button5.place(x=0, y=320, width=100, height=80)
root.mainloop()到此這篇關于Python-可視化單詞統(tǒng)計詞頻統(tǒng)計中文分詞的文章就介紹到這了,更多相關python中文詞頻統(tǒng)計內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python使用pyppeteer模塊實現(xiàn)無頭瀏覽器自動化
pyppeteer是一個基于Python的模塊,它提供了一個高級的API,可以通過控制無頭瀏覽器來實現(xiàn)自動化網頁操作,下面我們就來看看Python如何使用pyppeteer模塊實現(xiàn)無頭瀏覽器自動化吧2024-02-02
Django 用戶登陸訪問限制實例 @login_required
這篇文章主要介紹了Django 用戶登陸訪問限制實例 @login_required,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05

