当前位置: 首页> 健康> 美食 > 【Python进阶(十二)】——自然语言处理

【Python进阶(十二)】——自然语言处理

时间:2025/7/11 0:34:31来源:https://blog.csdn.net/jd1813346972/article/details/141537593 浏览次数:0次

🍉CSDN小墨&晓末:https://blog.csdn.net/jd1813346972

   个人介绍: 研一|统计学|干货分享
         擅长Python、Matlab、R等主流编程软件
         累计十余项国家级比赛奖项,参与研究经费10w、40w级横向

文章目录

  • 1 自然语言包导入及设置
  • 2 数据读入
  • 3 分词处理
  • 4自定义词汇
  • 5 停用词处理
  • 6 词性分布分析
  • 7 高频词分析
  • 8 词频统计
  • 9 关键词分析
  • 10 生成词云
  • 11 保存图片并释放内存

【Python进阶(十二)】——自然语言处理,建议收藏!


该篇文章主要讲解了基本的自然语言处理,包括自然语言的分词、停用词、词性分析、词频统计、词频分析、词云图生成等。

1 自然语言包导入及设置

import pynlpir as pynlpir#下载并导入包 pynlpir
import numpy as np   
import pandas as pd  
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r'c:\windows\fonts\simhei.ttf', size=15) #设置字体

2 数据读入

  运行程序:

text=open('2017.txt', 'r').read().replace('\n','')#逐行读取并将换行符去掉
text[:150]    #查看已读入数据:前150个字符

  运行结果:

3 分词处理

  运行程序:

pynlpir.open()#打开分词器
pynlpir.segment(text,pos_names='parent',pos_english=False)[:20]#进行探索性分词并显示结果的前20项
#pos_tagging:是否带有词性标注,默认为ture
#pos_names='parent':词性名称返回方式为基本,child为详细
#pos_english:词性名称是否用英文表示#探索性分词存在问题:
#(1)分词问题:某些词切分不准确
#(2)停用词问题:需要排除个别词语
#(3)缺字段“年份”

  运行结果:

如果pynlpir.open()报错:raise RuntimeError(“NLPIR function ‘NLPIR_Init’ failed.”) RuntimeError: NLPIR function ‘NLPIR_Init’ failed.

则是证书过期问题,点击链接:https://github.com/NLPIR-team/NLPIR

打包下载,然后把NLPIR.user替换到

D:\Anaconda3\Lib\site-packages\pynlpir\Data(以实际Python安装包site-packages位置为准)目录下的NLPIR.uer文件,重启解释器,发现pynlpir.open()就不报错了

4自定义词汇

  运行程序:

pynlpir.nlpir.AddUserWord('央视'.encode('utf8'),'noun')
pynlpir.nlpir.AddUserWord('主持人:'.encode('utf8'),'noun')
pynlpir.nlpir.AddUserWord('观众朋友们'.encode('utf8'),'noun')
pynlpir.nlpir.AddUserWord('春联'.encode('utf8'),'noun')
pynlpir.nlpir.AddUserWord('一号演播大厅'.encode('utf8'),'noun')
pynlpir.nlpir.AddUserWord('综合频道'.encode('utf8'),'noun')
pynlpir.nlpir.AddUserWord('综艺频道'.encode('utf8'),'noun')
pynlpir.nlpir.AddUserWord('中文国际频道'.encode('utf8'),'noun')
pynlpir.nlpir.AddUserWord('军事农业频道'.encode('utf8'),'noun')
pynlpir.nlpir.AddUserWord('少儿频道'.encode('utf8'),'noun') 

  运行结果:

2
2
2
2
2
2
2
2
2
2

  运行程序:

pynlpir.segment(text,pos_names='parent',pos_english=False)[:20] 

  运行结果:

[('主持人:', '名词'),('中国', '名词'),('中央电视台', '复合语'),('!', '标点符号'),('主持人:', '名词'),('中国', '名词'),('中央电视台', '复合语'),('!', '标点符号'),('主持人:', '名词'),('此刻', '代词'),('我们', '代词'),('在', '介词'),('北京', '名词'),('中央电视台', '复合语'),('一号演播大厅', '名词'),('向', '介词'),('全球', '名词'),('现场', '处所词'),('直播', '动词'),('《', '标点符号')]

  运行程序:

words = []
year=2017
year_words = []
year_words.extend(pynlpir.segment(text,pos_names='parent',pos_english=False))#追加一个分词结果的新列表for j in range(len(year_words)):ls_year_words=list(year_words[j])ls_year_words.append(year)words.append(ls_year_words)words[2:13]

  运行结果:

[['中央电视台', '复合语', 2017],['!', '标点符号', 2017],['主持人:', '名词', 2017],['中国', '名词', 2017],['中央电视台', '复合语', 2017],['!', '标点符号', 2017],['主持人:', '名词', 2017],['此刻', '代词', 2017],['我们', '代词', 2017],['在', '介词', 2017],['北京', '名词', 2017]]

  运行程序:

from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"       ##执行多输出df_words = pd.DataFrame(words,columns=["词汇","词性","年份"])#将words转化为数据框对象
df_words.head(25)df_words.index.size#显示数据框行数

  运行结果:

5 停用词处理

  运行程序:

stopwords= open('stopwords.txt').read()#读取停用词
stopwords[:20]

  运行结果:

'主持人:\n主持人:\n主持词\n(\n(\n?\n'

  运行程序:

for i in range(df_words.shape[0]):#行数if(df_words.词汇[i] in stopwords):df_words.drop(i,inplace=True)else:pass
df_words.head(15) #过滤停用词

  运行结果:

  运行程序:

df_words.shape[0] #过滤停用词后行数

  运行结果:

3976

6 词性分布分析

  运行程序:

df_WordSpeechDistribution = pd.DataFrame(df_words['词性'].value_counts(ascending=False))#value_counts:基数并按降序排序df_WordSpeechDistribution.head(10)df_WordSpeechDistribution.rename(columns={'count':'频数'},inplace=True)#修改列明df_WordSpeechDistribution.head()df_WordSpeechDistribution['频数'].sum()#查看行数

  运行结果:

  运行程序:

df_WordSpeechDistribution['百分比'] = df_WordSpeechDistribution['频数'] / df_WordSpeechDistribution['频数'].sum()#新增一列百分比
df_WordSpeechDistribution.head(10)

  运行结果:

  运行程序:

plt.subplots(figsize=(7,5))
df_WordSpeechDistribution.iloc[:10]['频数'].plot(kind='barh')#横向条形图
plt.yticks(fontproperties=font,size=10)
plt.xlabel('频数',fontproperties=font,size=10)
plt.ylabel('词性',fontproperties=font,size=10)
plt.title('2017央视春晚主持人【主持词】词性分布分析',fontproperties=font)

  运行结果:

7 高频词分析

  运行程序:

columns_slected=['动词','动词计数','名词','名词计数','代词','代词计数','助词','助词计数','副词','副词计数','形容词','形容词计数']df_Top6 = pd.DataFrame(columns=columns_slected)for i in range(0,12,2):df_Top6[columns_slected[i]] = df_words.loc[df_words['词性']==columns_slected[i]]['词汇'].value_counts().reset_index()['词汇']df_Top6[columns_slected[i+1]] = df_words.loc[df_words['词性']==columns_slected[i]]['词汇'].value_counts().reset_index()['count']df_Top6.head(16)

  运行结果:

8 词频统计

  运行程序:

df_words.head()df_AnnaulWords=df_words[["年份","词汇"]].pivot(columns="年份", values="词汇")#.pivot:重塑数据
df_AnnaulWords.head()

  运行结果:

  运行程序:

df_AnnaulWords.fillna(0,inplace=True)#将空值替换成0df_AnnaulWords.head()

  运行结果:

  运行程序:

df_AnnualTopWords=pd.DataFrame(columns=[2017])
df_AnnualTopWords[2017]=df_AnnaulWords[2017].value_counts().reset_index()[2017]
df_AnnualTopWords[1:].head(20)#第0行是0,需要排除

  运行结果:

9 关键词分析

  运行程序:

df_annual_keywords = pd.DataFrame(columns=[2017])
df_annual_keywords[2017]=pynlpir.get_key_words(' '.join(df_AnnualTopWords[2017].astype('str')))#提取关键词并保存到数据框
df_annual_keywords.head(10)  

  运行结果:

10 生成词云

  运行程序:

from wordcloud import WordCloud,ImageColorGenerator
from imageio import imreadfont_wc= r'C:\Windows\Fonts\msyhbd.ttc'#需要安装Visual C++ 14.0:http://landinghub.visualstudio.com/visual-cpp-build-tools,选择standalone compiler
myText=' '.join(df_words.词汇)
import imageio  bg_pic = imageio.v2.imread('cac617363047389f.jpg')  # 上传背景图片wc = WordCloud(font_path=font_wc, mask=bg_pic,max_words=500,max_font_size=200,background_color='white',colormap= 'Reds_r',scale=15.5)wc.generate(myText)
plt.imshow(wc)
plt.axis('off')

  运行结果:

11 保存图片并释放内存

  运行程序:

wc.to_file('chun.jpg')#保存图片
pynlpir.close()#释放内存
关键字:【Python进阶(十二)】——自然语言处理

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: