分享一个基于jieba库的Python 代码,它可以从文本中提取关键词,并提供图形界面。
代码效果是,选择文本文档进行关键词提取,将关键词显示在屏幕,并保存在指定文件内(guanjianci.txt)。
可以选择算法、单词长度、词性和关键词数量的。
代码注释
import tkinter as tk # 导入tkinter模块,用于创建GUI界面
import tkinter.filedialog # 导入tkinter.filedialog模块,用于文件选择对话框
import jieba.analyse # 导入jieba.analyse模块,用于关键词提取
import jieba.posseg as pseg # 导入jieba.posseg模块,用于词性标注
class KeywordExtractor:
def __init__(self, window):
self.window = window # 保存窗口对象
# 创建左侧Frame
self.left_frame = tk.Frame(window, width=500, height=500)
self.left_frame.pack(side=tk.LEFT)
# 创建算法选择Frame
self.algorithm_frame = tk.Frame(self.left_frame)
self.algorithm_frame.pack(side=tk.TOP, padx=10, pady=10, fill=tk.X)
self.algorithm_label = tk.Label(self.algorithm_frame, text="选择算法:", width=10)
self.algorithm_label.pack(side=tk.LEFT)
self.algorithm_var = tk.StringVar()
self.algorithm_var.set("tfidf")
self.algorithm_choices = [("tfidf", "TF-IDF算法"), ("textrank", "TextRank算法")]
for algo, algo_name in self.algorithm_choices:
rb = tk.Radiobutton(self.algorithm_frame, text=algo_name, variable=self.algorithm_var, value=algo)
rb.pack(side=tk.LEFT, padx=5)
# 创建单词长度设置Frame
self.word_length_frame = tk.Frame(self.left_frame)
self.word_length_frame.pack(side=tk.TOP, padx=10, pady=10, fill=tk.X)
self.word_length_label = tk.Label(self.word_length_frame, text="单词长度:", width=10)
self.word_length_label.pack(side=tk.LEFT)
self.word_length_entry = tk.Entry(self.word_length_frame, width=10)
self.word_length_entry.insert(0, "2")
self.word_length_entry.pack(side=tk.LEFT)
# 创建词性过滤选择Frame
self.pos_frame = tk.Frame(self.left_frame)
self.pos_frame.pack(side=tk.TOP, padx=10, pady=10, fill=tk.X)
self.pos_label = tk.Label(self.pos_frame, text="词性:", width=10)
self.pos_label.pack(side=tk.LEFT)
self.pos_choices = [("n", "名词"), ("nr", "人名"), ("ns", "地名"), ("eng", "其他专名"), ("a", "形容词"), ("v", "动词")]
self.pos_vars = {pos: tk.BooleanVar() for pos, _ in self.pos_choices}
for pos, pos_name in self.pos_choices:
cb = tk.Checkbutton(self.pos_frame, text=pos_name, variable=self.pos_vars[pos])
cb.pack(side=tk.LEFT, padx=5)
# 创建底部Frame
self.bottom_frame = tk.Frame(self.left_frame)
self.bottom_frame.pack(side=tk.TOP, padx=10, pady=10, fill=tk.X)
# 创建关键词数量的设置
self.topn_label = tk.Label(self.bottom_frame, text="关键词数量:", width=10)
self.topn_label.pack(side=tk.LEFT)
self.topn_entry = tk.Entry(self.bottom_frame, width=10)
self.topn_entry.insert(0, "10")
self.topn_entry.pack(side=tk.LEFT)
# 创建右侧Frame
self.right_frame = tk.Frame(window, width=450, height=500)
self.right_frame.pack(side=tk.RIGHT)
# 创建显示结果的文本框
self.result_text = tk.Text(self.right_frame, height=20)
self.result_text.pack(side=tk.TOP, padx=10, pady=10, fill=tk.BOTH, expand=True)
# 创建打开文件按钮
self.browse_btn = tk.Button(self.right_frame, text="打开文件", command=self.load_file)
self.browse_btn.pack(side=tk.LEFT, padx=10, pady=10)
# 创建分析按钮
self.analyze_btn = tk.Button(self.right_frame, text="分析", command=self.analyze)
self.analyze_btn.pack(side=tk.LEFT, padx=10, pady=10)
# 创建文件路径显示区域
self.filepath_frame = tk.Frame(self.right_frame)
self.filepath_frame.pack(side=tk.TOP, padx=10, pady=10, fill=tk.X)
self.filepath_label = tk.Label(self.filepath_frame, text="文件路径:", width=10)
self.filepath_label.pack(side=tk.LEFT)
self.filepath_entry = tk.Entry(self.filepath_frame, width=50)
self.filepath_entry.pack(side=tk.LEFT)
def load_file(self):
filepath = tk.filedialog.askopenfilename() # 打开文件选择对话框,并返回选择的文件路径
self.filepath_entry.delete(0, tk.END) # 清空文件路径输入框
self.filepath_entry.insert(0, filepath) # 在文件路径输入框中显示选中的文件路径
def analyze(self):
filepath = self.filepath_entry.get() # 获取文件路径
algorithm = self.algorithm_var.get() # 获取选择的算法
word_length = int(self.word_length_entry.get()) # 获取单词长度设置
topn = int(self.topn_entry.get()) # 获取关键词数量的设置
pos_filters = [pos for pos, var in self.pos_vars.items() if var.get()] # 获取选中的词性过滤器
with open(filepath, "r", encoding="utf-8") as f:
content = f.read() # 读取文件内容
if algorithm == "tfidf":
keywords = jieba.analyse.extract_tags(content, topK=topn, withWeight=True)
else: # algorithm == "textrank"
keywords = jieba.analyse.textrank(content, topK=topn, withWeight=True)
filtered_keywords = []
for keyword, weight in keywords:
if len(keyword) >= word_length:
words_with_pos = pseg.cut(keyword) # 对关键词进行词性标注
pos_list = [w.flag for w in words_with_pos] # 获取词性列表
if all([pos in pos_filters for pos in pos_list]): # 检查词性是否符合设定的过滤器
filtered_keywords.append((keyword, weight, pos_list))
sorted_keywords = sorted(filtered_keywords, key=lambda x: -x[1]) # 根据权重对关键词进行排序
result_str = "前{}个关键词及其权重:\n".format(topn)
for i, (keyword, weight, pos_list) in enumerate(sorted_keywords[:topn]):
result_str += "{}. {}:{}\n".format(i+1, keyword, weight)
result_str += " 词性:{}\n".format(",".join(pos_list))
self.result_text.delete(1.0, tk.END) # 清空文本框内容
self.result_text.insert(tk.END, result_str) # 在文本框中显示结果
with open("guanjianci.txt", "w", encoding="utf-8") as f: # 将结果保存到文件中
for i, (keyword, weight, pos_list) in enumerate(sorted_keywords[:topn]):
f.write("{}\t{}\t{}\n".format(keyword, weight, ",".join(pos_list)))
def main():
window = tk.Tk() # 创建窗口对象
window.title("Jieba实例4提取关键词")
window.geometry("900x500") # 设置窗口大小
# 初始化KeywordExtractor对象并启动事件循环
keyword_extractor = KeywordExtractor(window)
window.mainloop()
if __name__ == "__main__":
main()
知识点
※Tkinter作为Python中用于创建GUI界面的标准工具包,提供了许多常用的功能。
- 创建窗口:使用Tk()函数创建一个窗口对象,并使用title()函数设置窗口标题。
- 添加组件:使用Frame、Label、Button、Entry等类来创建窗口中的各种组件,例如文本框、按钮和标签等。
- 布局管理:使用pack()、grid()或place()方法对组件进行布局管理,决定它们在窗口中的位置和大小。
- 事件处理:使用bind()方法将事件与相应的处理函数关联起来,当用户进行某些操作时,触发相应的事件并执行处理函数。
- 文件操作:可以使用filedialog模块中的函数,如askopenfilename()和asksaveasfilename(),打开文件选择对话框或保存文件对话框。
- 文本显示:通过Text组件可以在窗口中显示文本,可以使用insert()方法插入文本,delete()方法删除文本。
- 弹窗提示:使用messagebox模块中的函数,如showinfo()、showwarning()和showerror(),弹出消息提示框、警告框和错误框。
- 图形绘制:可以使用Canvas组件来绘制图形,如直线、矩形、圆等,使用create_line()、create_rectangle()、create_oval()等方法。
- 图片显示:可以使用PIL库(Python Imaging Library)加载图片,并使用PhotoImage类将图片显示在窗口中。
- 菜单和工具栏:使用Menu和Toolbar等类来创建菜单栏和工具栏,提供更多的操作选项和功能。