Python的中文分词库有很多,常见的有:

  • jieba(结巴分词)
  • THULAC(清华大学自然语言处理与社会人文计算实验室)
  • pkuseg(北京大学语言计算与机器学习研究组)
  • SnowNLP
  • pynlpir
  • CoreNLP
  • pyltp

参考:https://www.jianshu.com/p/7ad0cd33005e

nltk词频统计

本文使用的包为nltk包,使用pip语句就可以安装,安装后使用 nltk.download()下载扩展部分

首先,我们配置需要使用的包和文本材料

import nltk
import math
import string 
import nltk.stem
from nltk.corpus import stopwords
from collections import Counter

#设置三段文本
text_1 = "In information retrieval, tf–idf or TFIDF, short for term frequency–inverse document frequency, is a numerical statistic that is intended to reflect how important a word is to a document in a collection or corpus. It is often used as a weighting factor in searches of information retrieval, text mining, and user modeling. The tf–idf value increases proportionally to the number of times a word appears in the document and is offset by the number of documents in the corpus that contain the word, which helps to adjust for the fact that some words appear more frequently in general. Tf–idf is one of the most popular term-weighting schemes today; 83% of text-based recommender systems in digital libraries use tf–idf."
text_2 = "Variations of the tf–idf weighting scheme are often used by search engines as a central tool in scoring and ranking a document's relevance given a user query. tf–idf can be successfully used for stop-words filtering in various subject fields, including text summarization and classification."
text_3 = "One of the simplest ranking functions is computed by summing the tf–idf for each query term; many more sophisticated ranking functions are variants of this simple model."

punctuation_map = dict((ord(char), None) for char in string.punctuation)  #引入标点符号,为下步去除标点做准备
s = nltk.stem.SnowballStemmer('english')   #在提取词干时,语言使用英语,使用的语言是英语

在对文本进行提取关键词之前,我们需要对文本进行处理,去除文本的标点符号、去除文本的一些停用词(比如介词in,连词and等)。因为在文章中,in和and的出现频率可能会很高,但是它们没有实际意义,所以我们需要将其去除掉。

def stem_count(text):
    l_text = text.lower()     #全部转化为小写以方便处理 
    without_punctuation = l_text.translate(punctuation_map)    #去除文章标点符号
    tokens = nltk.word_tokenize(without_punctuation)        #将文章进行分词处理,将一段话转变成一个list
    without_stopwords = [w for w in tokens if not w in stopwords.words('english')]    #去除文章的停用词
    cleaned_text = [] 
    for i in range(len(without_stopwords)):
        cleaned_text.append(s.stem(without_stopwords[i]))    #提取词干
    count = Counter(cleaned_text)                 #实现计数功能
    return count

接下来,我们定义TF-IDF的计算过程。

#定义TF-IDF的计算过程
def D_con(word, count_list): 
    D_con = 0
    for count in count_list:
        if word in count:
            D_con += 1
    return D_con
def tf(word, count): 
    return count[word] / sum(count.values())
def idf(word, count_list): 
    return math.log(len(count_list)) / (1 + D_con(word, count_list))
def tfidf(word, count, count_list):
    return tf(word, count) * idf(word, count_list)

最后,我们分析文本

texts = [text_1, text_2, text_3] 
count_list = [] 
for text in texts: 
    count_list.append(stem_count(text))      #填入清洗好后的文本
for i in range(len(count_list)):
    print('For document {}'.format(i+1))
    tf_idf = {}
    for word in count_list[i]:
        tf_idf[word] = tfidf(word, count_list[i], count_list)
    sort = sorted(tf_idf.items(), key = lambda x: x[1], reverse=True) #将集合按照TF-IDF值从大到小排列
    for word, tf_idf in sort[:7]: 
        print("\tWord: {} : {}".format(word, round(tf_idf, 6)))
————————————————
版权声明:本文为CSDN博主「海军上将光之翼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43216017/article/details/86755145

wordcloud库

以下参考:https://zhuanlan.zhihu.com/p/103080917

首先,安装所需的库。(当然,记得先安好python)

可以直接在cmd中(按下win+R,输入 cmd 后点确定)分别输入以下代码进行安装(部分可能已系统内置),也可以用其他方式进行安装。不过个人比较推荐通过cmd进行安装,毕竟cmd安装方便,不费事儿。

pip install re
pip install jieba
pip install collections
pip install numpy
pip install PIL
pip install wordcloud
pip install matplotlib.pyplot

安装完成后,就可以开心的敲代码啦~

在代码的开头,先进行一些定义

在程序的开头进行定义,是为了以后修改代码更加方便。当然,在凭空开始写程序的时候,可能自己也不清楚自己之后都需要定义哪些东西,所以这一步可以在边写代码时边在程序开头进行修改。

另外,在运行程序的时候,记得把程序运行所需文件放在程序的运行目录下

# 主要功能自定义设置
Analysis_text = '分析文档.txt'        # 分析文档
userdict = '用户词典.txt'             # 用户词典
StopWords = '停用词库.txt'            # 停用词库
number = 100                          # 统计个数
Output = '词频.txt'                   # 输出文件
background = '词频背景.jpg'           # 词频背景

然后是导入相关的库

这个没什么好说的,代码的注释中已经解释的很详细了。(我是按用到的库的先后顺序对安装库和导入库的顺序进行排序的哦,这样也许会更好理解一些)

# 导入扩展库
import re                           # 正则表达式库
import jieba                        # 结巴分词
import jieba.posseg                 # 词性获取
import collections                  # 词频统计库
import numpy                        # numpy数据处理库
from PIL import Image               # 图像处理库
import wordcloud                    # 词云展示库
import matplotlib.pyplot as plt     # 图像展示库(这里以plt代表库的全称)

在导入扩展库后,才是程序正文的开始。

工作的开头,当然是对所需分析文档进行读取

读取方式有很多种,这里选择用open这一种比较简洁的方式;在读取完成后,不要忘记close哦,这是一个好————————习惯!(或者用with语句)这里读取的文件“Analysis_text”是前文定义的“Analysis_text = '分析文档.txt'”。

# 读取文件
fn = open(Analysis_text,'r',encoding = 'UTF-8')  # 打开文件
string_data = fn.read()                          # 读出整个文件
fn.close()                                       # 关闭文件

读取完成后,对文本进行一些预处理

# 文本预处理
pattern = re.compile(u'\t|\n|\.|-|:|;|\)|\(|\?|"') # 定义正则表达式匹配模式(空格等)
string_data = re.sub(pattern, '', string_data)     # 将符合模式的字符去除

添加动态调整词典用户词典功能。这两个功能并不是必须的,大家可以根据个人需求决定是否使用。变量“userdict”是开头定义的“userdict = '用户词典.txt'”。

这两个功能的用处,是在自带词库的基础上、 根据动态调整词典/用户词典中的字/词对文档内容进行分词统计。若对程序自带词库的分词效果不尽满意, 可以在动态调整词典/用户词典中单独加入想要统计的词汇,以提高个别词汇识别成功率。格式为每行一个字/词。 比如:想统计“小小花”这个词的出现次数,但程序可能会将其分为“小小”“ 花”这两个词语分别进行统计;或是将“小小花”与前后文字/词一同进行统计,如“小小花朵”。 这时就可以在动态调整词典/用户词典中加入“小小花”一词,以提高识别成功率。

# 动态调整词典
jieba.suggest_freq('小小花', True)     #True表示该词不能被分割,False表示该词能被分割# 添加用户词典
jieba.load_userdict(userdict)

进行分词

利用jieba词库进行分词。jieba词库在汉语语义分析中运用的十分广泛,上手也相对容易一点。更详细的相关介绍大家可以千度一下,我就不占地儿了。这里采用的是精确模式分词+使用HMM模型,可以将字/词划分的更加准确。

# 文本分词
seg_list_exact = jieba.cut(string_data, cut_all=False, HMM=True)    # 精确模式分词+HMM
object_list = []

去除停用词

对于停用词库中出现的词汇,程序不会进行统计。这个功能也不是必须的,大家可以根据个人需求决定是否使用。这里给出的停用词库是前面定义的“StopWords = '停用词库.txt'”,用的是常见的“Chinese stopwords”词库。这个词库在网上不太难找,懒得找的话也可以在我上面给出的链接中进行下载。

# 去除停用词(去掉一些意义不大的词,如标点符号、嗯、啊等)
with open(StopWords, 'r', encoding='UTF-8') as meaninglessFile:stopwords = set(meaninglessFile.read().split('\n'))
stopwords.add(' ')
for word in seg_list_exact:         # 循环读出每个分词if word not in stopwords:       # 如果不在去除词库中object_list.append(word)    # 分词追加到列表

进行词频统计

这里的“number”是前面定义的“number = 100”,具体数值大家也可以自己更改。词频统计也有很多种写法,但个人认为使用Couter进行统计更加简洁。

# 词频统计
word_counts = collections.Counter(object_list)       # 对分词做词频统计
word_counts_top = word_counts.most_common(number)    # 获取前number个最高频的词

然后是添加“英文词性转中文词性字典”

我在这个程序中加入了词性分析的功能,即识别当前字/词是形容词、动词还是名词等等。但jieba自带的词性分析输出结果为英文(a/v/n等),不便于用户直接阅读;因此我就在网上搜罗了一圈,自己花了点时间整理出来了这两个对照词典。

词典分为简洁版和详细版两个版本,大家按需所取。一般来说简洁版的就够用了,所以我在我的程序中使用的也是简洁版的转换。

# 英文词性转中文词性字典:简洁版
En2Cn = {'a'    : '形容词','ad'   : '形容词','ag'   : '形容词','al'   : '形容词','an'   : '形容词','b'    : '区别词','bl'   : '区别词','c'    : '连词','cc'   : '连词','d'    : '副词','e'    : '叹词','eng'  : '英文','f'    : '方位词','g'    : '语素','h'    : '前缀','i'    : '成语','j'    : '简称略语','k'    : '后缀','l'    : '习用语','m'    : '数词','mq'   : '数量词','n'    : '名词','ng'   : '名词','nl'   : '名词','nr'   : '名词','nr1'  : '名词','nr2'  : '名词','nrf'  : '名词','nrfg' : '名词',    'nrj'  : '名词','ns'   : '名词','nsf'  : '名词','nt'   : '名词','nz'   : '名词','o'    : '拟声词','p'    : '介词','pba'  : '介词','pbei' : '介词','q'    : '量词','qt'   : '量词','qv'   : '量词','r'    : '代词','rg'   : '代词','rr'   : '代词','rz'   : '代词','rzs'  : '代词','rzt'  : '代词','rzv'  : '代词','ry'   : '代词','rys'  : '代词','ryt'  : '代词','ryv'  : '代词','s'    : '处所词','t'    : '时间词','tg'   : '时间词','u'    : '助词','ude1' : '助词','ude2' : '助词','ude3' : '助词','udeng': '助词','udh'  : '助词','uguo' : '助词','ule'  : '助词','ulian': '助词','uls'  : '助词','usuo' : '助词','uyy'  : '助词','uzhe' : '助词','uzhi' : '助词','v'    : '动词','vd'   : '动词','vf'   : '动词','vg'   : '动词','vi'   : '动词','vl'   : '动词','vn'   : '动词','vshi' : '动词','vx'   : '动词','vyou' : '动词','w'    : '标点符号','wb'   : '标点符号','wd'   : '标点符号','wf'   : '标点符号','wj'   : '标点符号','wh'   : '标点符号','wkz'  : '标点符号','wky'  : '标点符号','wm'   : '标点符号','wn'   : '标点符号','wp'   : '标点符号','ws'   : '标点符号','wt'   : '标点符号','ww'   : '标点符号','wyz'  : '标点符号','wyy'  : '标点符号','x'    : '字符串','xu'   : '字符串','xx'   : '字符串','y'    : '语气词','z'    : '状态词','un'   : '未知词',
}
# 英文词性转中文词性字典:详细版
En2Cn_Pro = {'a'    : '形容词','ad'   : '形容词-副形词','ag'   : '形容词-形容词性语素','al'   : '形容词-形容词性惯用语','an'   : '形容词-名形词','b'    : '区别词','bl'   : '区别词-区别词性惯用语','c'    : '连词','cc'   : '连词-并列连词','d'    : '副词','e'    : '叹词','eng'  : '英文','f'    : '方位词','g'    : '语素','h'    : '前缀','i'    : '成语','j'    : '简称略语','k'    : '后缀','l'    : '习用语','m'    : '数词','mq'   : '数量词','n'    : '名词','ng'   : '名词-名词性语素','nl'   : '名词-名词性惯用语','nr'   : '名词-人名','nr1'  : '名词-汉语姓氏','nr2'  : '名词-汉语名字','nrf'  : '名词-音译人名','nrfg' : '名词-人名',    'nrj'  : '名词-日语人名','ns'   : '名词-地名','nsf'  : '名词-音译地名','nt'   : '名词-机构团体名','nz'   : '名词-其他专名','o'    : '拟声词','p'    : '介词','pba'  : '介词-“把”','pbei' : '介词-“被”','q'    : '量词','qt'   : '量词-动量词','qv'   : '量词-时量词','r'    : '代词','rg'   : '代词-代词性语素','rr'   : '代词-人称代词','rz'   : '代词-指示代词','rzs'  : '代词-处所指示代词','rzt'  : '代词-时间指示代词','rzv'  : '代词-谓词性指示代词','ry'   : '代词-疑问代词','rys'  : '代词-处所疑问代词','ryt'  : '代词-时间疑问代词','ryv'  : '代词-谓词性疑问代词','s'    : '处所词','t'    : '时间词','tg'   : '时间词-时间词性语素','u'    : '助词','ude1' : '助词-“的”“底”','ude2' : '助词-“地”','ude3' : '助词-“得”','udeng': '助词-“等”“等等”“云云”','udh'  : '助词-“的话”','uguo' : '助词-“过”','ule'  : '助词-“了”“喽”','ulian': '助词-“连”','uls'  : '助词-“来讲”“来说”“而言”“说来”','usuo' : '助词-“所”','uyy'  : '助词-“一样”“一般”“似的”“般”','uzhe' : '助词-“着”','uzhi' : '助词-“之”','v'    : '动词','vd'   : '动词-副动词','vf'   : '动词-趋向动词','vg'   : '动词-动词性语素','vi'   : '动词-不及物动词(内动词)','vl'   : '动词-动词性惯用语','vn'   : '动词-名动词','vshi' : '动词-“是”','vx'   : '动词-形式动词','vyou' : '动词-“有”','w'    : '标点符号','wb'   : '标点符号-百分号千分号,全角:% ‰ 半角:%','wd'   : '标点符号-逗号,全角:, 半角:,','wf'   : '标点符号-分号,全角:; 半角: ; ','wj'   : '标点符号-句号,全角:。','wh'   : '标点符号-单位符号,全角:¥ $ £ ° ℃ 半角 $','wkz'  : '标点符号-左括号,全角:( 〔 [ { 《 【 〖 〈 半角:( [ { <','wky'  : '标点符号-右括号,全角:) 〕 ] } 》 】 〗 〉 半角: ) ] { >','wm'   : '标点符号-冒号,全角:: 半角: :','wn'   : '标点符号-顿号,全角:、','wp'   : '标点符号-破折号,全角:—— -- ——- 半角:—','ws'   : '标点符号-省略号,全角:…… …','wt'   : '标点符号-叹号,全角:! 半角:!','ww'   : '标点符号-问号,全角:? 半角:?','wyz'  : '标点符号-左引号,全角:“ ‘ 『','wyy'  : '标点符号-右引号,全角:” ’ 』','x'    : '字符串','xu'   : '字符串-网址URL','xx'   : '字符串-非语素字','y'    : '语气词','z'    : '状态词','un'   : '未知词',
}

接下来的这一步最为关键,是把词频分析结果输出至工作台,并导出“词频.txt”文件

为使分析结果便于理解,首先输出/写入“\n词语\t词频\t词性”,并用破折号作为分割线进行划分。利用count计数,进行双重for循环:第一重for循环是获取前number个词语与其词频,第二重for循环是获取前number个词语的词性;若count≠number,则依次输出/写入词语、词频、词性,并将count+1;直到count=number,终止循环。

另外,输出文件“Output”是前文定义的“Output = '词频.txt'”,程序会在运行目录下创建文本文件并进行写入。

# 输出至工作台,并导出“词频.txt”文件
print ('\n词语\t词频\t词性')
print ('——————————')
fileOut = open(Output,'w',encoding='UTF-8')     # 创建文本文件;若已存在,则进行覆盖
fileOut.write('词语\t词频\t词性\n')
fileOut.write('——————————\n')
count = 0
for TopWord,Frequency in word_counts_top:                       # 获取词语和词频for POS in jieba.posseg.cut(TopWord):                       # 获取词性if count == number:breakprint(TopWord + '\t',str(Frequency) + '\t',list(En2Cn.values())[list(En2Cn.keys()).index(POS.flag)])                    # 逐行输出数据fileOut.write(TopWord + '\t' + str(Frequency) + '\t' + list(En2Cn.values())[list(En2Cn.keys()).index(POS.flag)] + '\n') # 逐行写入str格式数据count += 1
fileOut.close()                                                 # 关闭文件

其实若能实现上面所给出的所有代码,那就已经是一个较为完善的词频分析软件了。但是我觉得还不够,还要再做点什么。

于是加入了制作词云这一功能。

首先,输出“开始制作词云……”,提示用户系统当前运行状态。定义词频的背景,这里的“background”是前面定义的“background = '词频背景.jpg'”。调用wordcloud函数,对部分参数进行调整。最后利用plt函数进行词云的展示。

# 词频展示
print ('\n开始制作词云……')                    # 提示当前状态
mask = numpy.array(Image.open(background))      # 定义词频背景
wc = wordcloud.WordCloud(font_path = 'C:/Windows/Fonts/simfang.ttf', # 设置字体(这里选择“仿宋”)background_color='white',                   # 背景颜色mask = mask,                                # 文字颜色+形状(有mask参数再设定宽高是无效的)max_words = number,                         # 显示词数max_font_size = 150                         # 最大字号
)wc.generate_from_frequencies(word_counts)                                        # 从字典生成词云
wc.recolor(color_func=wordcloud.ImageColorGenerator(mask))                       # 将词云颜色设置为背景图方案
plt.figure('词云')                                                               # 弹框名称与大小
plt.subplots_adjust(top=0.99,bottom=0.01,right=0.99,left=0.01,hspace=0,wspace=0) # 调整边距
plt.imshow(wc, cmap=plt.cm.gray, interpolation='bilinear')                       # 处理词云
plt.axis('off')                                                                  # 关闭坐标轴
print ('制作完成!')                                                             # 提示当前状态
print ('\n作者:丨小小花丨')
print ('日期:2020.01.16')
plt.show()  

至此,一个词频分析的程序就基本完成啦!

最后!是加入一个小小的语句——

# 避免程序运行完成后直接退出
input()

在运行.py文件时,程序在运行完成后常常会“一闪而过”,很多时候是因为程序运行完了没事儿干了就自闭了。其实只要在代码的最后加上这样一句话就可以解决啦!

python 词频统计,分词笔记相关推荐

  1. python词频统计(word ——> excel,含去重)

    word资料处理 -------> 存入excel 精简地从word文档读取资料,分析后传入excel文档. 不是txt!因为我的电脑是mac,针对txt的乱码问题解决不了. 主要操作的思维导图 ...

  2. python词频统计完整步骤_Python中文文本分词、词频统计、词云绘制

    本文主要从中文文本分词.词频统计.词云绘制方面介绍Python中文文本分词的使用.会使用到的中文文本处理包包括:wordcloud,jieba,re(正则表达式),collections. 1 准备工 ...

  3. python词频统计时、文件放哪里_初学python,词频统计小实验

    最近突然对python感兴趣,就学了起来.我可怜的计算机基础只有VB,而且学的时候这门课还特别水,仅仅了解了语法,考试基本上是背题过的. 现在自学python还是比较吃力.今天捣鼓了一下午,搞出了一个 ...

  4. python词频统计的方式

    现有列表如下: [6, 7, 5, 9, 4, 1, 8, 6, 2, 9] 希望统计各个元素出现的次数,可以看作一个词频统计的问题. 我们希望最终得到一个这样的结果:{6:2, 7:1...}即 { ...

  5. python词频统计代码_python统计词频

    一.程序分析 (1)将文件读入缓冲区(dst指文本文件存放路径,设置成形参,也可以不设,具体到函数里设置) def process_file(dst): # 读文件到缓冲区try: # 打开文件 tx ...

  6. python词频统计GUI(thinter)

    本文介绍利用python实现了简单的词频统计程序,其中涉及了简单的正则表达式的使用和python可视化模块tkinter的使用.完成了选择任意的文件,然后统计其中的单词的出现频度并以列表的形式展现出来 ...

  7. python词频统计完整步骤_Python统计词频的几种方式

    语料 text = """My fellow citizens: I stand here today humbled by the task before us, gr ...

  8. python词频统计西游记_实例10-文本词频统计.pdf

    Python语言程序设计 实例10: 文本词频统计 嵩 天 北京理工大学 "文本词频统计"问题分析 CC BY-NC-SA 4.0 嵩天 问题分析 文本词频统计 - 需求 :一篇文 ...

  9. python词频统计实验报告_Python实验报告八

    安徽工程大学Python程序设计 班级:物流191 姓名:汤振宇 学号:319050108 成绩: 日期:2020/06/04 指导老师:修宇 [实验目的] : 掌握读写文本文件或 CSV 文件,进而 ...

最新文章

  1. c primer plus 5 读书笔记1
  2. android 发送前台广播,使用IntentService与BroadcastReceiver实现后台服务(Android7.0可用)...
  3. 地图上制作线路的动画_魔兽争霸重制版不只是表面上这么简单,新版编辑器制作地图更容易...
  4. 《系统集成项目管理工程师》必背100个知识点-07项目建议书的内容
  5. C++AVL树(自平衡二叉查找树)(附完整源码)
  6. PHP被忽视的编码规范
  7. 【视频教程】利用Excel轻松爬取网页上的数据
  8. ICE专题:ICE简介
  9. 基于Apache POI 从xlsx读出数据
  10. sql t-sql_增强的PolyBase SQL 2019-使用t-SQL的外部表
  11. 6-3 断言与防御式编程
  12. android 浏览器 该网站的安全证书有问题
  13. html中左三角怎么写,css3三角形怎么写?
  14. Excel 画函数曲线
  15. BeanUtils.copyProperties不支持复制集合的解决方案
  16. 基于Linux下的即时通讯聊天室项目(全代码 有注释 可直接运行)
  17. Arduino - 摇杆模块
  18. 包装类------拆箱与装箱
  19. 【洛谷】P3518 [POI2011]SEJ-Strongbox
  20. CST(Crypto Systems Toolkit) 7.1学习笔记-chapter6

热门文章

  1. 调试异常 Free Heap block xxxxxxxx modified at xxxxxxxx after it was freed
  2. 窗体的扩展样式GWL_EXSTYLE: 用于SetWindowLong
  3. DUILib 中的通知事件
  4. Android开发精要2--Android组件模型解析
  5. Linux2.6内核 -- 结构的初始化
  6. 拷贝构造函数的参数类型必须是引用
  7. android 弹出编辑框,Android编程实现的EditText弹出打开和关闭工具类
  8. linux中断下半部
  9. mac软件移植linux,相比软件迁移 Apple Silicon Mac的Linux系统移植工作更困难
  10. Linux安装redis最新版5.0.8