1.案例总结和完善
根据这几次课的讲解,请完成以下任务:
A撰写一个自然语言处理编程文档,从程序实现的功能,设计思想,用到主要的库和函数介绍,测试数据,输出结果等方面总结,撰写文档提交到课程平台上的作业,并发布到你的技术博客中。
B完善自然语言处理程序,把各个功能写成函数形式,在主程序中调用。比如分词功能词频统计功能,词性分类保存txt功能,读取txt文件生成饼状图可视化功能,柱图可视化功能,关系图可视化功能,词云可视化功能,建立人工手动自定义词典功能,统计人名并保存 txt功能,统计地名并保存txt功能,统计武器并保存txt功能:
C给此系统加一个界面(easxgui或者tkinter),或者做成网站形式(diango)根据完成情况(有代码,有文档,有设计,有分析,有结果),在课程平台上酌情给分
A 自然语言处理编程文档
程序实现的功能:
分词功能:将输入的文本进行分词处理,将文本拆分成单个的词语。
词频统计功能:统计分词后每个词语的出现频率。
词性分类保存功能:对分词结果进行词性标注,并将结果保存到文本文件中。
可视化功能:包括生成饼状图、柱状图、关系图和词云图,直观展示文本的特征。
自定义词典功能:允许用户手动添加自定义词典,提高分词的准确性。
特定实体统计保存功能:统计文本中的人名、地名和武器名称,并分别保存到文本文件中。
2. 设计思想
程序采用模块化设计思想,将各个功能封装成独立的函数,提高代码的可读性和可维护性。主程序负责调用这些函数,完成整个自然语言处理流程。具体流程如下:
读取输入文本。
进行分词处理,可选择是否使用自定义词典。
对分词结果进行词性标注和词频统计。
根据需求进行可视化展示。
统计特定实体(人名、地名、武器名)并保存到文件中。
3. 用到主要的库和函数介绍
jieba
库
功能:中文分词库,支持多种分词模式。
- 主要函数:
jieba.lcut(text)
:对输入的文本进行分词,返回一个词语列表。jieba.load_userdict(file_path)
:加载自定义词典。
jieba.posseg
模块
- 功能:用于词性标注。
- 主要函数:
jieba.posseg.cut(text)
:对输入的文本进行分词并标注词性,返回一个包含词语和词性的迭代器。
collections.Counter
类
- 功能:用于统计可迭代对象中元素的出现频率。
- 主要方法:
Counter(iterable)
:创建一个Counter
对象,统计iterable
中元素的出现频率。most_common(n)
:返回出现频率最高的n
个元素及其计数。
matplotlib
库
- 功能:用于数据可视化,可生成各种图表。
- 主要函数:
plt.pie(sizes, labels=labels, autopct='%1.1f%%')
:生成饼状图。plt.bar(labels, values)
:生成柱状图。plt.show()
:显示图表。
networkx
库
- 功能:用于创建、操作和研究复杂网络的结构、动态和功能。
- 主要函数:
nx.Graph()
:创建一个无向图对象。nx.draw(G, with_labels=True)
:绘制图。
wordcloud
库
- 功能:用于生成词云图。
- 主要函数:
WordCloud().generate(text)
:根据输入的文本生成词云图。plt.imshow(wordcloud, interpolation='bilinear')
:显示词云图。
4. 测试数据
小明在北京使用手枪进行射击训练,小红在上海使用步枪练习瞄准。
5. 输出结果
分词结果:将文本拆分成单个词语。
词频统计结果:每个词语的出现频率。
词性分类文件:保存分词结果及其词性的文本文件。
可视化图表:饼状图、柱状图、关系图和词云图。
特定实体文件:保存人名、地名和武器名的文本文件。
B.
import jieba import jieba.posseg as pseg from collections import Counter import matplotlib.pyplot as plt import networkx as nx from wordcloud import WordCloud 分词功能 def tokenize(text, custom_dict=None): if custom_dict: jieba.load_userdict(custom_dict) return jieba.lcut(text) 词频统计功能 def word_frequency(words): return Counter(words) 词性分类保存功能 def pos_tagging_and_save(words, output_file): pos_tags = pseg.cut(''.join(words)) with open(output_file, 'w', encoding='utf-8') as f: for word, flag in pos_tags: f.write(f'{word} {flag}\n') 生成饼状图可视化功能 def plot_pie(word_freq, top_n=5): top_words = word_freq.most_common(top_n) labels = [word for word, _ in top_words] sizes = [count for _, count in top_words] plt.pie(sizes, labels=labels, autopct='%1.1f%%') plt.axis('equal') plt.show() 柱图可视化功能 def plot_bar(word_freq, top_n=5): top_words = word_freq.most_common(top_n) labels = [word for word, _ in top_words] values = [count for _, count in top_words] plt.bar(labels, values) plt.show() 关系图可视化功能 def plot_relationship(words): G = nx.Graph() for i in range(len(words) - 1): G.add_edge(words[i], words[i + 1]) nx.draw(G, with_labels=True) plt.show() 词云可视化功能 def plot_wordcloud(words): text = ' '.join(words) wordcloud = WordCloud().generate(text) plt.imshow(wordcloud, interpolation='bilinear') plt.axis('off') plt.show() 建立人工手动自定义词典功能 def load_custom_dict(dict_file): jieba.load_userdict(dict_file) 统计人名并保存 txt 功能 def count_persons(words, output_file): pos_tags = pseg.cut(''.join(words)) persons = [word for word, flag in pos_tags if flag.startswith('nr')] with open(output_file, 'w', encoding='utf-8') as f: for person in persons: f.write(person + '\n') 统计地名并保存 txt 功能 def count_places(words, output_file): pos_tags = pseg.cut(''.join(words)) places = [word for word, flag in pos_tags if flag.startswith('ns')] with open(output_file, 'w', encoding='utf-8') as f: for place in places: f.write(place + '\n') 统计武器并保存 txt 功能 def count_weapons(words, output_file): weapons = ['手枪', '步枪'] # 简单示例,可根据实际情况扩展 weapon_list = [word for word in words if word in weapons] with open(output_file, 'w', encoding='utf-8') as f: for weapon in weapon_list: f.write(weapon + '\n')
C.
import tkinter as tk from tkinter import filedialog import jieba import jieba.posseg as pseg from collections import Counter import matplotlib.pyplot as plt import networkx as nx from wordcloud import WordCloud from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 分词功能 def tokenize(text, custom_dict=None): if custom_dict: jieba.load_userdict(custom_dict) return jieba.lcut(text) 词频统计功能 def word_frequency(words): return Counter(words) 词性分类保存功能 def pos_tagging_and_save(words, output_file): pos_tags = pseg.cut(''.join(words)) with open(output_file, 'w', encoding='utf-8') as f: for word, flag in pos_tags: f.write(f'{word} {flag}\n') 生成饼状图可视化功能 def plot_pie(word_freq, top_n=5): top_words = word_freq.most_common(top_n) labels = [word for word, _ in top_words] sizes = [count for _, count in top_words] fig = plt.Figure(figsize=(5, 5), dpi=100) ax = fig.add_subplot(111) ax.pie(sizes, labels=labels, autopct='%1.1f%%') ax.axis('equal') return fig 柱图可视化功能 def plot_bar(word_freq, top_n=5): top_words = word_freq.most_common(top_n) labels = [word for word, _ in top_words] values = [count for _, count in top_words] fig = plt.Figure(figsize=(5, 5), dpi=100) ax = fig.add_subplot(111) ax.bar(labels, values) return fig 关系图可视化功能 def plot_relationship(words): G = nx.Graph() for i in range(len(words) - 1): G.add_edge(words[i], words[i + 1]) fig = plt.Figure(figsize=(5, 5), dpi=100) ax = fig.add_subplot(111) nx.draw(G, with_labels=True, ax=ax) return fig 词云可视化功能 def plot_wordcloud(words): text = ' '.join(words) wordcloud = WordCloud().generate(text) fig = plt.Figure(figsize=(5, 5), dpi=100) ax = fig.add_subplot(111) ax.imshow(wordcloud, interpolation='bilinear') ax.axis('off') return fig 统计人名并保存 txt 功能 def count_persons(words, output_file): pos_tags = pseg.cut(''.join(words)) persons = [word for word, flag in pos_tags if flag.startswith('nr')] with open(output_file, 'w', encoding='utf-8') as f: for person in persons: f.write(person + '\n') 统计地名并保存 txt 功能 def count_places(words, output_file): pos_tags = pseg.cut(''.join(words)) places = [word for word, flag in pos_tags if flag.startswith('ns')] with open(output_file, 'w', encoding='utf-8') as f: for place in places: f.write(place + '\n') 统计武器并保存 txt 功能 def count_weapons(words, output_file): weapons = ['手枪', '步枪'] # 简单示例,可根据实际情况扩展 weapon_list = [word for word in words if word in weapons] with open(output_file, 'w', encoding='utf-8') as f: for weapon in weapon_list: f.write(weapon + '\n') def process_text(): text = text_entry.get("1.0", tk.END).strip() custom_dict = custom_dict_entry.get() words = tokenize(text, custom_dict) freq = word_frequency(words) 词性分类保存 pos_tagging_and_save(words, 'pos_tags.txt') 可视化 pie_fig = plot_pie(freq) bar_fig = plot_bar(freq) rel_fig = plot_relationship(words) wc_fig = plot_wordcloud(words) 显示饼状图 pie_canvas = FigureCanvasTkAgg(pie_fig, master=pie_frame) pie_canvas.draw() pie_canvas.get_tk_widget().pack() 显示柱状图 bar_canvas = FigureCanvasTkAgg(bar_fig, master=bar_frame) bar_canvas.draw() bar_canvas.get_tk_widget().pack() 显示关系图 rel_canvas = FigureCanvasTkAgg(rel_fig, master=rel_frame) rel_canvas.draw() rel_canvas.get_tk_widget().pack() 显示词云图 wc_canvas = FigureCanvasTkAgg(wc_fig, master=wc_frame) wc_canvas.draw() wc_canvas.get_tk_widget().pack() 统计特定实体 count_persons(words, 'persons.txt') count_places(words, 'places.txt') count_weapons(words, 'weapons.txt') 创建主窗口 root = tk.Tk() root.title("自然语言处理系统") 输入文本框 text_label = tk.Label(root, text="输入文本:") text_label.pack() text_entry = tk.Text(root, height=10, width=50) text_entry.pack() 自定义词典输入框 custom_dict_label = tk.Label(root, text="自定义词典路径:") custom_dict_label.pack() custom_dict_entry = tk.Entry(root, width=50) custom_dict_entry.pack() 处理按钮 process_button = tk.Button(root, text="处理文本", command=process_text) process_button.pack() 可视化框架 visual_frame = tk.Frame(root) visual_frame.pack() pie_frame = tk.Frame(visual_frame) pie_frame.pack(side=tk.LEFT) bar_frame = tk.Frame(visual_frame) bar_frame.pack(side=tk.LEFT) rel_frame = tk.Frame(visual_frame) rel_frame.pack(side=tk.LEFT) wc_frame = tk.Frame(visual_frame) wc_frame.pack(side=tk.LEFT) 运行主循环 root.mainloop()