1. 程序实现的功能
本程序实现了一个自然语言处理(NLP)工具,能够对文本进行多方面的分析和处理。核心功能包括:
-
分词功能:将输入的文本拆解成词语或单词,支持中英文文本。
-
词频统计功能:统计文本中各个词语的出现频率。
-
词性标注功能:识别文本中每个词语的词性(如名词、动词等)。
-
可视化功能:生成词云、柱状图、饼状图等可视化图表,直观展示词频统计结果。
-
实体识别功能:识别文本中的命名实体(如人名、地名、组织等)。
-
自定义词典功能:允许用户添加自定义词汇,提升分词和实体识别的准确性。
-
输出结果:将统计数据和可视化结果保存到文件中。
2. 设计思想
本程序采用模块化设计,每个功能独立实现,便于扩展和维护。程序的基本框架如下:
-
文本处理模块:负责文本的预处理(如分词、去除停用词等)。
-
统计模块:实现词频统计、词性标注等功能。
-
可视化模块:生成词云、柱状图、饼状图等可视化图表。
-
自定义词典模块:支持用户添加自定义词汇。
-
输入输出模块:处理用户输入并将结果输出到文件。
3. 用到的主要库和库函数介绍
3.1 主要库
-
nltk
(Natural Language Toolkit):-
用于英文文本的分词、词性标注、词频统计等。
-
主要函数:
-
nltk.word_tokenize()
:对英文文本进行分词。 -
nltk.pos_tag()
:对文本进行词性标注。 -
nltk.FreqDist()
:统计词频。
-
-
-
jieba
:-
中文分词库,用于对中文文本进行分词。
-
主要函数:
-
jieba.cut()
:对中文文本进行分词。
-
-
-
matplotlib
:-
数据可视化库,用于绘制柱状图、饼状图、点状图等。
-
主要函数:
-
matplotlib.pyplot.bar()
:绘制柱状图。 -
matplotlib.pyplot.pie()
:绘制饼状图。 -
matplotlib.pyplot.scatter():绘制点状图。
-
-
-
wordcloud
:-
用于生成词云图。
-
主要函数:
-
WordCloud()
:生成词云。
-
-
-
easygui
/tkinter
:-
提供简单的图形用户界面(GUI),
easygui
适合简单交互,tkinter
适合开发更复杂的界面。
-
4. 测试数据
为测试程序功能,可以使用以下示例文本:
自然语言处理(NLP)是计算机科学和人工智能领域中的一个重要研究方向。它主要研究如何让计算机理解、处理和生成自然语言。NLP技术在机器翻译、语音识别、情感分析等领域有广泛的应用。近年来,随着深度学习技术的不断发展,NLP的研究取得了显著进展。李明教授在研究中指出,未来NLP技术将广泛应用于医疗、金融、教育等多个行业。
测试数据包含专业术语、人名、地名等实体,适合测试分词、词性标注、实体识别等功能。
5. 输出结果
5.1 分词结果
['自然', '语言', '处理', 'NLP', '是', '计算机', '科学', '和', '人工智能', '领域', '中', '的', '一个', '重要', '研究', '方向', ...]
5.2 词频统计结果
{'自然': 2, '语言': 3, '处理': 1, 'NLP': 2, '计算机': 1, '科学': 1, ...}
5.3 词性标注结果
[('自然', 'NN'), ('语言', 'NN'), ('处理', 'VB'), ('NLP', 'NN'), ...]
5.4 可视化输出
-
词云图:展示高频词汇,词频越高,词语越大。
-
柱状图:展示词汇的出现频率。
-
饼状图:展示词汇的出现比例。
5.5 保存统计结果到文件
自然: 2 语言: 3 处理: 1 NLP: 2 计算机: 1 ...
6. 核心功能实现代码示例
6.1 分词功能(jieba
)
import jieba s = u'我想和女朋友一起去北京博物馆参观和逛街。' cut = jieba.cut(s) print('[Output]') print(cut) print(','.join(cut)) print(','.join(jieba.cut(s,cut_all=True)))
6.2 词频统计功能(nltk
)
import jieba from collections import Counter # 输入文本 s = u'我想和女朋友一起去北京博物馆参观和逛街。我想去北京博物馆参观,因为那里有很多珍贵的文物。' # 分词 cut = jieba.cut(s) # 统计词频 word_freq = Counter(cut) # 输出结果 print('[Output]') print("分词结果:") print(','.join(word_freq.keys())) # 输出分词结果 print("\n词频统计结果:") for word, freq in word_freq.items(): print(f"{word}: {freq}")
6.3 词性标注(nltk
)
import jieba.posseg as pseg
# 输入文本
s = u'我想和女朋友一起去北京博物馆参观和逛街。'
# 词性标注
words = pseg.cut(s)
# 输出结果
print('[Output]')
print("词性标注结果:")
for word, flag in words:
print(f"{word}({flag})", end=' ')
6.4 生成可视化图表(matplotlib
和 wordcloud
)
6.4.1 柱状图
import matplotlib.pyplot as plt
import numpy as np
def drawPillar():
# 定义消费分类和对应的支出金额
categories = ('教育', '餐饮', '购物', '医疗', '服务', '娱乐', '转账', '交通', '其他')
amounts = [150.78, 137.00, 106.90, 36.00, 34.08, 34.00, 18.00, 9.00, 27.00]
# 设置图片清晰度
plt.rcParams['figure.dpi'] = 300
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决负号显示问题
plt.rcParams['axes.unicode_minus'] = False
# 创建图形和坐标轴
fig, ax = plt.subplots()
# 生成柱状图的索引
index = np.arange(len(categories))
# 柱状图的宽度
bar_width = 0.35
# 透明度
opacity = 0.4
# 绘制柱状图
rects = ax.bar(index, amounts, bar_width, alpha=opacity, color='b')
# 设置坐标轴标签和标题
ax.set_xlabel('支出分类')
ax.set_ylabel('支出金额')
ax.set_title('我的支出')
# 设置 x 轴刻度标签
ax.set_xticks(index)
ax.set_xticklabels(categories)
# 显示数值
def autolabel(rects):
for rect in rects:
height = rect.get_height()
ax.annotate('{}'.format(height),
xy=(rect.get_x() + rect.get_width() / 2, height),
xytext=(0, 3), # 3 points vertical offset
textcoords="offset points",
ha='center', va='bottom')
autolabel(rects)
# 显示图形
plt.tight_layout()
plt.show()
# 调用函数
drawPillar()
6.4.2 饼状图
from matplotlib import pyplot as plt
plt.figure(figsize=(6,9))
# 定义饼状图的标签,标签是列表
labels=['第一部分','第二部分','第三部分']
sizes = [60,30,10]
colors = ['red','yellowgreen','lightskyblue']
explode = (0.05,0,0)
patches,I_text,p_text =plt.pie(sizes,explode=explode,labels=labels,colors=colors,labeldistance = 1.1,autopct = '%3.1f%%',shadow =False, startangle = 90,pctdistance = 0.6)
for t in I_text:
t.set_size(30)
for t in p_text:
t.set_size(20)
plt.axis('equal')
plt.legend()
plt.show()
6.4.3 词云图
import jieba
import jieba.analyse as anl
import jieba.posseg as pseg
import json
from collections import Counter
import numpy as np
from PIL import Image
from wordcloud import WordCloud, ImageColorGenerator
from matplotlib.font_manager import FontProperties#中文字体
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
# 3. 绘制词云
def GetCloud():
wlist = []
# 3.1分词
path_txt = "D:/Python数据分析/二十大公报.txt"
try:
f = open(path_txt, 'r', encoding='UTF_8').read()
except FileNotFoundError:
print(f"文件 {path_txt} 未找到,请检查文件路径。")
return
cut_text = jieba.cut(f)
# 3.2去掉停用词
stopwords = ["\n", "", "。", ",", "【", "】", "_", ":", ";", "!", "?", "“", "”", "\u3000"]
for i in cut_text:
if i not in stopwords:
if len(i) > 1: # 单字的去掉,保留2个及以上的字
wlist.append(i)
# 3.3画词云
path_img = "D:/Python数据分析/背景.jpg"
try:
background_image = np.array(Image.open(path_img))
except FileNotFoundError:
print(f"图片 {path_img} 未找到,请检查文件路径。")
return
listStr = "/".join(wlist)
# 设置最大显示的字数
maxWords = 200
# 补全字体路径,这里以 Windows 系统的宋体为例
font_path = "C:/Windows/Fonts/simhei.ttf" # 黑体字体,如果需要其他字体,可以替换路径
wordcloud = WordCloud(
# 设置字体,文字的路径是电脑的字体一般路径,可换成别的
font_path=font_path,
background_color="white",
# mask参数=图片背景,必须写上,另外有mask参数在设定宽高是无效的
mask=background_image,
max_words=maxWords, # 设置最大显示的字数
max_font_size=50, # 设置字体最大值
random_state=30, # 设置有多少种随机生成状态,即有多少种配色方案
margin=2
).generate(listStr)
# 生成颜色
image_colors = ImageColorGenerator(background_image)
# 下面代码表示显示图片
plt.imshow(wordcloud.recolor(color_func=image_colors), interpolation="bilinear")
plt.axis("off")
plt.show()
# 调用函数
GetCloud()
6.4.4 统计人名并保存txt功能
#按词性统计人名
def wordscutper(santi words with attr):
#获取过滤掉 stop _attr里的词性的词后的分词列表,不过正确率堪忧
pername =[x[0] for x in santi_ words with_attr if x[1]=="nr"]
#把一个人的不同称谓统一一下
for i p in enumerate(pername):
if p=="玄德"orp=="刘备"orp=="刘玄德":
permame[i]="刘备"
if p=="关羽"or p=="云长" or p=="关公" or p=="关将军":
pername[ij]="关羽"
if p=="曹操" or p=="丞相" or p=="孟德":
permame[i]="曹操"
if p=="诸葛亮"or p=="孔明" or p=="武侯":
pername[i]="诸葛亮"
c=Counter(pername).most._common(20)
with open('sanguoper.txt','w+') as f:
f write('{0},{1}\n'.format(x[0],x[1]))
6.4.5 按词性统计地名
def wordscutplace(santi_ words with attr):
placename =[x[0] for x in santi words_with_ attr if x[1]=="ns"]
c =Counter(placename).most_common(20)
with open('sanguoplace.txt','w+') as f:
for x in c:
f write('{0},{1}\n'.format(x[0],x[1])
7. 总结
本程序通过模块化设计实现了一个功能丰富的自然语言处理工具,涵盖了分词、词频统计、词性标注、可视化等功能。通过使用nltk
、jieba
、matplotlib
、wordcloud
等库,程序能够高效地处理和分析文本数据。测试结果表明,程序能够准确地完成各项任务,并输出直观的可视化结果。