news 2026/9/1 12:01:24

Python 自然语言处理(NLP)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 自然语言处理(NLP)

本文是自然语言处理(NLP)课程的实践总结,基于 Python 实现了文本分词、词频统计、词性分析、命名实体识别等核心功能,并通过可视化图表和 GUI 界面直观展示结果。技术栈涵盖jieba(分词)、matplotlib(可视化)、wordcloud(词云)、tkinter(桌面界面),适合 NLP 入门学习者参考。

1. 程序功能概述

本次实现的 NLP 程序核心功能如下:

表格

功能模块实现效果
文本分词支持精确模式 / 全模式 / 搜索引擎模式分词,可导入自定义词典优化分词效果
词频统计统计分词后词语出现频次,结果保存为 TXT 文件(格式:词语 频次)
词性分析识别词语词性(名词 / 动词 / 形容词等),统计词性分布并保存
命名实体识别提取文本中的人名、地名、机构名等实体,统计实体类型与频次
可视化展示生成词频柱状图、词性分布饼图、自定义样式词云图
可视化界面基于 tkinter 实现桌面 GUI,支持文本输入、功能选择、结果一键导出
2. 设计思想

程序采用 “模块化 + 主程序调用” 的架构,核心逻辑分为三层:

文本输入/文件导入

分词→词频统计→词性分析→实体识别

文件保存→可视化图表→GUI展示

数据输入层:支持手动输入文本或导入 TXT 文件;

核心处理层:每个功能封装为独立函数,降低耦合性;

结果输出层:多格式保存结果 + 可视化展示,兼顾实用性与直观性。

3. 核心库与关键函数说明

表格

库名作用核心函数及说明
jieba中文分词 / 词性分析jieba.lcut(text):精确模式分词;jieba.posseg.cut(text):分词 + 词性标注
collections数据统计Counter(words):统计词频,most_common(n):获取前 n 个高频词
matplotlib数据可视化plt.bar():绘制词频柱状图;plt.pie():绘制词性分布饼图
wordcloud词云生成WordCloud():自定义词云样式(背景、字体、颜色)
tkinter桌面 GUI 开发tk.Text():文本输入框;tk.Button():功能按钮;tk.Label():结果展示
pandas辅助数据处理pd.DataFrame():结构化存储词频 / 词性数据,便于后续分析
4. 测试数据与环境

7.2 优化方向

针对入门级实现的不足,可从以下维度升级:

7.3 学习收获

通过本次实践,系统掌握了 NLP 基础流程:

  • 测试数据:选取《三体》节选文本(约 5000 字)、新闻资讯文本(约 2000 字);
  • 5.1.2 词性分析核心函数运行环境:Python 3.8+,依赖库安装命令:

    bash

    pip install jieba matplotlib wordcloud pandas tkinter

    5. 核心代码与效果展示

    5.1 基础功能核心代码

    5.1.1 词频统计核心函数
    import jieba from collections import Counter # 定义停用词列表(可根据需求扩展) STOP_WORDS = ["的", "了", "及", "和", "与", "在", "是", "有", "就", "都", "而", "也", "之"] def word_frequency_analysis(text, save_path="word_freq.txt"): """ 词频统计函数 :param text: 待分析文本 :param save_path: 结果保存路径 :return: 词频统计结果(Counter对象) """ # 1. 精确模式分词 words = jieba.lcut(text) # 2. 过滤停用词和单字,保留有效词语 words_filtered = [w for w in words if w not in STOP_WORDS and len(w) > 1] # 3. 统计词频 word_freq = Counter(words_filtered) # 4. 保存结果到TXT文件 with open(save_path, "w", encoding="utf-8") as f: f.write("词语 频次\n") for word, cnt in word_freq.most_common(): f.write(f"{word} {cnt}\n") return word_freq # 测试调用 if __name__ == "__main__": # 示例文本(《三体》节选) test_text = "三体讲述了地球人类文明和三体文明的信息交流、生死搏杀及两个文明在宇宙中的兴衰历程。\ 面对前所未有的危局,人类组建起庞大的太空舰队,制订了神秘莫测的“面壁计划”,秘密展开对三体人的反击。" # 执行词频统计 freq = word_frequency_analysis(test_text) print("高频词TOP5:", freq.most_common(5))
  • 5.1.2 词性分析核心函数
  • import jieba.posseg as pseg def pos_analysis(text, save_path="pos_dist.txt"): """ 词性分析函数 :param text: 待分析文本 :param save_path: 结果保存路径 :return: 词性分布结果(字典) """ # 1. 分词并标注词性 words_pos = pseg.lcut(text) # 2. 统计各词性频次 pos_dict = {} for word, pos in words_pos: if word not in STOP_WORDS and len(word) > 1: pos_dict[pos] = pos_dict.get(pos, 0) + 1 # 3. 保存词性结果 with open(save_path, "w", encoding="utf-8") as f: # 词性缩写说明,提升结果可读性 pos_desc = {"n": "名词", "v": "动词", "a": "形容词", "adv": "副词", "pron": "代词"} f.write("词性 频次 词性说明\n") for pos, cnt in pos_dict.items(): f.write(f"{pos} {cnt} {pos_desc.get(pos, '其他')}\n") return pos_dict # 测试调用 pos_result = pos_analysis(test_text) print("词性分布:", pos_result)
    5.2 可视化效果展示
  • import matplotlib.pyplot as plt # 设置matplotlib中文显示 plt.rcParams["font.sans-serif"] = ["SimHei"] # 适配中文显示 plt.rcParams["axes.unicode_minus"] = False # 解决负号显示问题 def plot_word_freq(word_freq): """绘制词频柱状图""" # 取前10个高频词 top_words = word_freq.most_common(10) words = [w[0] for w in top_words] counts = [w[1] for w in top_words] # 绘制柱状图 plt.figure(figsize=(10, 6)) plt.bar(words, counts, color="skyblue") plt.title("文本高频词TOP10", fontsize=14) plt.xlabel("词语", fontsize=12) plt.ylabel("频次", fontsize=12) plt.xticks(rotation=45) # 旋转x轴标签,避免重叠 plt.tight_layout() # 自适应布局 plt.show() # 调用绘图函数 plot_word_freq(freq)

    5.2.2 词性分布饼图

    def plot_pos_pie(pos_dict): """绘制词性分布饼图""" # 筛选主要词性(占比≥1%),简化图表 total = sum(pos_dict.values()) pos_filtered = {k: v for k, v in pos_dict.items() if v/total >= 0.01} # 词性名称映射 pos_desc = {"n": "名词", "v": "动词", "a": "形容词", "adv": "副词"} labels = [pos_desc.get(k, "其他") for k in pos_filtered.keys()] sizes = list(pos_filtered.values()) # 绘制饼图 plt.figure(figsize=(8, 8)) plt.pie(sizes, labels=labels, autopct="%1.1f%%", startangle=90, colors=["#FF6B6B", "#4ECDC4", "#45B7D1", "#96CEB4"]) plt.title("文本词性分布", fontsize=14) plt.axis("equal") # 保证饼图为正圆形 plt.show() # 调用绘图函数 plot_pos_pie(pos_result)

    5.2.3 自定义词云图

    from wordcloud import WordCloud def generate_wordcloud(word_freq, save_path="wordcloud.png"): """生成自定义词云图""" # 将词频字典转换为字符串(词云输入格式) text_str = " ".join([word * cnt for word, cnt in word_freq.most_common(100)]) # 配置词云样式 wc = WordCloud( font_path="simhei.ttf", # 本地中文字体文件(Windows默认存在) width=800, height=600, background_color="white", # 背景色 max_words=100, # 最大显示词数 colormap="viridis" # 配色方案 ).generate(text_str) # 显示并保存词云 plt.figure(figsize=(10, 6)) plt.imshow(wc, interpolation="bilinear") plt.axis("off") # 隐藏坐标轴 plt.title("文本词云图", fontsize=14) plt.tight_layout() plt.savefig(save_path, dpi=300) # 保存高清词云图 plt.show() # 调用词云生成函数 generate_wordcloud(freq)

    5.3 命名实体识别效果

    def entity_recognition(text): """命名实体识别(人名/地名/机构名)""" words_pos = pseg.lcut(text) entities = {"人名": [], "地名": [], "机构名": []} for word, pos in words_pos: if len(word) < 2: continue if pos == "nr": entities["人名"].append(word) elif pos == "ns": entities["地名"].append(word) elif pos == "nt": entities["机构名"].append(word) # 统计实体频次 entity_freq = {k: Counter(v) for k, v in entities.items()} return entity_freq # 测试调用 entity_result = entity_recognition(test_text) print("命名实体识别结果:", entity_result)

    6. tkinter GUI 界面完整实现

  • 6.1 界面整体设计

    基于tkinter开发的可视化界面,整合所有核心功能,支持 “文本输入→功能选择→结果展示→一键导出” 全流程,界面布局如下:

  • 文本输入区:支持手动输入或粘贴文本,配备滚动条适配长文本;
  • 功能按钮区:分词统计、词性分析、实体识别、可视化、导出结果等一键操作;
  • 结果展示区:实时显示分析结果,支持文本复制与保存;
  • 导出功能:将词频、词性、实体识别结果批量导出为 TXT 文件。
    import tkinter as tk from tkinter import ttk, filedialog, messagebox import os class NLPTextAnalyzerGUI: def __init__(self, root): self.root = root self.root.title("NLP文本分析工具") self.root.geometry("900x700") # 初始化变量 self.word_freq = None # 词频结果 self.pos_freq = None # 词性结果 self.entity_freq = None# 实体识别结果 # 创建界面组件 self._create_widgets() def _create_widgets(self): # 1. 文本输入区域 frame_input = ttk.LabelFrame(self.root, text="文本输入") frame_input.pack(fill="both", expand=True, padx=10, pady=5) self.text_editor = tk.Text(frame_input, height=10, font=("SimHei", 10)) self.text_editor.pack(side="left", fill="both", expand=True, padx=5, pady=5) # 滚动条 scrollbar = ttk.Scrollbar(frame_input, orient="vertical", command=self.text_editor.yview) scrollbar.pack(side="right", fill="y") self.text_editor.config(yscrollcommand=scrollbar.set) # 2. 功能按钮区域 frame_btn = ttk.Frame(self.root) frame_btn.pack(fill="x", padx=10, pady=5) # 功能按钮 ttk.Button(frame_btn, text="词频统计", command=self.analyze_word_freq).pack(side="left", padx=5) ttk.Button(frame_btn, text="词性分析", command=self.analyze_pos).pack(side="left", padx=5) ttk.Button(frame_btn, text="实体识别", command=self.analyze_entity).pack(side="left", padx=5) ttk.Button(frame_btn, text="生成词云", command=self.gen_wordcloud).pack(side="left", padx=5) ttk.Button(frame_btn, text="导出结果", command=self.export_result).pack(side="left", padx=5) ttk.Button(frame_btn, text="清空文本", command=self.clear_text).pack(side="left", padx=5) # 3. 结果展示区域 frame_result = ttk.LabelFrame(self.root, text="分析结果") frame_result.pack(fill="both", expand=True, padx=10, pady=5) self.result_text = tk.Text(frame_result, height=10, font=("SimHei", 10)) self.result_text.pack(fill="both", expand=True, padx=5, pady=5) # 功能函数绑定 def analyze_word_freq(self): text = self.text_editor.get("1.0", tk.END).strip() if not text: messagebox.showwarning("警告", "请输入待分析文本!") return self.word_freq = word_frequency_analysis(text) # 展示结果 result = "词频统计TOP20:\n" for i, (word, cnt) in enumerate(self.word_freq.most_common(20), 1): result += f"{i}. {word}:{cnt}次\n" self.result_text.delete("1.0", tk.END) self.result_text.insert("1.0", result) # 绘制柱状图 plot_word_freq(self.word_freq) def analyze_pos(self): text = self.text_editor.get("1.0", tk.END).strip() if not text: messagebox.showwarning("警告", "请输入待分析文本!") return self.pos_freq = pos_analysis(text) # 展示结果 pos_desc = {"n": "名词", "v": "动词", "a": "形容词", "adv": "副词"} result = "词性分布结果:\n" for pos, cnt in self.pos_freq.items(): result += f"{pos_desc.get(pos, pos)}:{cnt}次\n" self.result_text.delete("1.0", tk.END) self.result_text.insert("1.0", result) # 绘制饼图 plot_pos_pie(self.pos_freq) def analyze_entity(self): text = self.text_editor.get("1.0", tk.END).strip() if not text: messagebox.showwarning("警告", "请输入待分析文本!") return self.entity_freq = entity_recognition(text) # 展示结果 result = "命名实体识别结果:\n" for ent_type, ent_cnt in self.entity_freq.items(): result += f"\n【{ent_type}】:\n" if ent_cnt: for name, cnt in ent_cnt.most_common(): result += f"{name}:{cnt}次\n" else: result += "无匹配实体\n" self.result_text.delete("1.0", tk.END) self.result_text.insert("1.0", result) def gen_wordcloud(self): if not self.word_freq: messagebox.showwarning("警告", "请先执行词频统计!") return generate_wordcloud(self.word_freq) messagebox.showinfo("成功", "词云已生成并保存!") def export_result(self): if not (self.word_freq or self.pos_freq or self.entity_freq): messagebox.showwarning("警告", "暂无分析结果可导出!") return # 选择保存路径 file_path = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=[("文本文件", "*.txt")]) if not file_path: return # 写入结果 with open(file_path, "w", encoding="utf-8") as f: f.write("=== 词频统计结果 ===\n") if self.word_freq: for word, cnt in self.word_freq.most_common(): f.write(f"{word} {cnt}\n") f.write("\n=== 词性分析结果 ===\n") if self.pos_freq: pos_desc = {"n": "名词", "v": "动词", "a": "形容词"} for pos, cnt in self.pos_freq.items(): f.write(f"{pos_desc.get(pos, pos)} {cnt}\n") f.write("\n=== 实体识别结果 ===\n") if self.entity_freq: for ent_type, ent_cnt in self.entity_freq.items(): f.write(f"\n【{ent_type}】:\n") for name, cnt in ent_cnt.most_common(): f.write(f"{name} {cnt}\n") messagebox.showinfo("成功", f"结果已导出至:{file_path}") def clear_text(self): self.text_editor.delete("1.0", tk.END) self.result_text.delete("1.0", tk.END) self.word_freq = None self.pos_freq = None self.entity_freq = None # 启动界面 if __name__ == "__main__": root = tk.Tk() app = NLPTextAnalyzerGUI(root) root.mainloop()

    6.3 界面使用说明

  • 文本输入:在左侧文本框粘贴或输入待分析文本(如《三体》节选、新闻文本);
  • 功能操作:点击 “词频统计”“词性分析” 等按钮,自动完成分析并展示结果;
  • 可视化:点击 “生成词云” 可自动绘制词云图,词频 / 词性分析后会自动弹出柱状图 / 饼图;
  • 结果导出:点击 “导出结果” 可将所有分析结果保存为 TXT 文件,便于后续查看。
  • 7. 总结与优化方向

    7.1 功能总结

    本次实现的 NLP 程序完成了课程要求的所有核心任务:

  • 基础层:实现分词、词频统计、词性分析、命名实体识别,结果可保存为 TXT;
  • 可视化层:支持柱状图、饼图、词云图等多类型图表,直观展示文本特征;
  • 交互层:基于 tkinter 开发 GUI 界面,操作简单,支持一键导出结果。
  • 分词精度提升:接入更精准的分词模型(如 THULAC、HanLP),替代 jieba 的规则分词;
  • 实体识别增强:集成专业 NER 模型(如 BERT-NER),提升人名 / 地名 / 机构名识别准确率;
  • 可视化扩展:基于networkx实现实体关系网络图,展示实体间的关联;
  • 界面升级:开发 Web 界面(基于 Django/Flask),支持在线文本分析与结果分享;
  • 多格式支持:扩展 PDF、DOCX 等文本格式导入,适配更多场景。
  • 理解中文分词的核心逻辑,掌握停用词过滤、词性标注的实用技巧;
  • 熟悉 matplotlib、wordcloud 等可视化库的使用,能将文本数据转化为直观图表;
  • 掌握 tkinter GUI 开发流程,实现 “功能封装 + 交互设计” 的工程化思维;
  • 理解 NLP 技术在实际场景中的应用(如文本挖掘、舆情分析),为后续进阶学习奠定基础。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 17:24:59

MQTT 协议详解

MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输&#xff09;是ISO/IEC 20922标准化的、基于发布 / 订阅&#xff08;Pub/Sub&#xff09;范式的轻量级消息传输协议&#xff0c;专为低带宽、高延迟、网络不稳定、算力 / 内存受限的物联网&am…

作者头像 李华
网站建设 2026/7/14 17:24:57

Python基于flask的养老院管理系统的设计与实现膳食

目录 膳食模块功能设计数据库模型设计菜单管理接口营养分析功能特殊饮食处理报表生成前端模板示例测试方案安全措施部署考虑 项目技术支持可定制开发之功能创新亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作 膳食模块功能设计 膳食模…

作者头像 李华