Python中文分词及词频统计

中文分词

中文分词(Chinese Word Segmentation),将中文语句切割成单独的词组。英文使用空格来分开每个单词的,而中文单独一个汉字跟词有时候完全不是同个含义,因此,中文分词相比英文分词难度高很多。

分词主要用于NLP 自然语言处理(Natural Language Processing),使用场景有:

搜索优化,关键词提取(百度指数) 语义分析,智能问答系统(客服系统) 非结构化文本媒体内容,如社交信息(微博热榜) 文本聚类,根据内容生成分类(行业分类)

分词库

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

  • jieba(结巴分词)

  • THULAC(清华大学自然语言处理与社会人文计算实验室)

  • pkuseg(北京大学语言计算与机器学习研究组)

  • SnowNLP

  • pynlpir

  • CoreNLP

  • pyltp

通常前三个是比较经常见到的,主要在易用性/准确率/性能都还不错。我个人常用的一直都是结巴分词(比较早接触),最近使用pkuseg,两者的使用后面详细讲。

结巴分词

简介

  • “结巴”中文分词:做最好的 Python 中文分词组件

  • 支持三种分词模式:

    • 精确模式,试图将句子最精确地切开,适合文本分析;

    • 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;

    • 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。

  • 支持繁体分词

  • 支持自定义词典

实例

我们使用京东商场的美的电器评论来看看结巴分词的效果。如果你没有安装结巴分词库则需要在命令行下输入pip install jieba,安装完之后即可开始分词之旅。

评论数据整理在文件meidi_jd.csv文件中,读取数据前先导入相关库。因为中文的文本或文件的编码方式不同编码选择gb18030,有时候是utf-8、gb2312、gbk自行测试。

 ​# 导入相关库import pandas as pdimport jieba​# 读取数据data = pd.read_csv('meidi_jd.csv', encoding='gb18030')​# 查看数据data.head()

 # 生成分词data['cut'] = data['comment'].apply(lambda x : list(jieba.cut(x)))​data.head()

到这里我们仅仅通过一行代码即可生成中文的分词列表,如果你想要生成分词后去重可以改成这样。

 data['cut'] = data['comment'].apply(lambda x : list(set(jieba.cut(x))))['很', '好', '很', '好', '很', '好', '很', '好', '很', '好', '很', '好', '很', '好', '很', '好', '很', '好', '很', '好', '很', '好']

这时候我们就需要导入自定义的词典,以便包含 jieba 词库里没有的词。虽然 jieba 有新词识别能力,但是自行添加新词可以保证更高的正确率。自定义词典采用一词一行,为了演示我添加了“很好”并保存在dict.txt文件中,让我们开始用自定义的词典吧!

 data['cut'] = data['comment'].apply(lambda x : list(jieba.cut(x)))​data.head()​print(data['cut'].loc[14])['很好', '很好', '很好', '很好', '很好', '很好', '很好', '很好', '很好', '很好', '很好']

停用词

分词的过程中我们会发现实际上有些词实际上意义不大,比如:标点符号、嗯、啊等词,这个时候我们需要将停用词去除掉。首先我们需要有个停用词词组,可以自定义也可以从网上下载词库,这里我们使用网上下载的停用词文件StopwordsCN.txt。

 # 读取停用词数据stopwords = pd.read_csv('StopwordsCN.txt', encoding='utf8', names=['stopword'], index_col=False)​stopwords.head()

接下里我们只要适当更改分词的代码即可在分词的时候去掉停用词:

 # 转化词列表 stop_list = stopwords['stopword'].tolist() ​ # 去除停用词 data['cut'] = data['comment'].apply(lambda x : [i for i in jieba.cut(x) if i not in stop_list]) ​ data.head()

词频统计

到这里我们基本是已经学会用Python库进行分词,关于词频统计的方式也很多,我们先将所有分词合并在一起方便统计。

 # 将所有的分词合并words = []​for content in data['cut']:words.extend(content)

方式一:

 
# 创建分词数据框corpus = pd.DataFrame(words, columns=['word'])corpus['cnt'] = 1​# 分组统计g = corpus.groupby(['word']).agg({'cnt': 'count'}).sort_values('cnt', ascending=False)​g.head(10)

方式二:

 # 导入相关库from collections import Counterfrom pprint import pprint​​counter = Counter(words)​# 打印前十高频词pprint(counter.most_common(10))[('不错', 3913),('安装', 3055),('好', 2045),('很好', 1824),('买', 1634),('热水器', 1182),('挺', 1051),('师傅', 923),('美', 894),('送货', 821)]

结尾

我个人的使用建议,如果想简单快速上手分词可以使用结巴分词,但如果追求准确度和特定领域分词可以选择pkuseg加载模型再分词。另外jieba和THULAC并没有提供细分领域预训练模型,如果想使用自定义模型分词需使用它们提供的训练接口在细分领域的数据集上进行训练,用训练得到的模型进行中文分词。

代码练习

 import jiebaimport jieba.analyseimport codecsimport refrom collections import Counterfrom wordcloud import WordCloudimport matplotlib.pyplot as pltimport wordcloud​str = "我在河南大学上学,今年22岁了"​seg_list = jieba.cut(str,cut_all=True)print("全模式:"+"/".join(seg_list))​seg_list = jieba.cut(str,cut_all=False)print("默认(精确模式):"+"/".join(seg_list))​# 搜索引擎模式seg_list = jieba.cut_for_search(str)print("搜索引擎模式:"+"/".join(seg_list))​# 添加用户自定义词典str = "大连圣亚在大连"seg_list = jieba.cut(str,cut_all=False)print("默认(精确模式):"+"/".join(seg_list))​# 添加自定义词典后jieba.load_userdict(r"./user_dict.txt")seg_list = jieba.cut(str,cut_all=False)print("默认(精确模式):"+"/".join(seg_list))​str = "我家在河南省驻马店市汝南县东官庄镇"seg_list = jieba.cut(str) #默认是精确模式print("精确模式:"+"/".join(seg_list))​# 动态调整词典jieba.add_word("东官庄镇")seg_list = jieba.cut(str)print("精确模式:"+"/".join(seg_list))​​# 加载停用词# 创建停用词列表def stopwordlist():stopwords = [line.strip() for line in open('./hit_stopwords.txt',encoding='UTF-8').readlines()]return stopwords​​# 对句子进行中文分词def seg_depart(sentence):print('正在分词')sentence_depart = jieba.cut(sentence.strip())# 创建一个停用词列表stopwords = stopwordlist()# 输出结果为 outstroutstr = ''#     去停用词for word in sentence_depart:if word not in stopwords:if word != '\t':outstr += wordoutstr += " "return outstr​​# 给出文档路径filename = "./text.txt"outfilename = "./out.txt"inputs = open(filename,'r',encoding='UTF-8')outputs = open(outfilename,'w',encoding='UTF-8')​​jieba.add_word("停用词")# 将输出结果写到out.txt中for line in inputs:line_seg = seg_depart(line)​outputs.write(line_seg + '\n')print("-------------------------正在分词和去停用词--------------------------")print("原文:"+line)print("去停用词:"+line_seg)​outputs.close()inputs.close()print("删除停用词和分词成功!!!")​​# class WordCounter(object):def count_from_file(file,top_limit=0):with codecs.open(file,'r','UTF-8') as f:content = f.read()# 将多个空格替换为一个空格content =re.sub(r'\s+',r' ',content)content = re.sub(r'\.+',r' ',content)​# 去停用词content = seg_depart(content)​​return count_from_str(content,top_limit=top_limit)​​def count_from_str(content,top_limit=0):if top_limit <= 0:top_limit = 100#     提取文章的关键词tags = jieba.analyse.extract_tags(content,topK=100)​words = jieba.cut(content)​counter = Counter()​for word in words:if word in tags:counter[word] += 1​return counter.most_common(top_limit)​​# if __name__ == '__main__':#     counter = WordCounter()#     retult = counter.count_from_file(r'./text.txt',top_limit=10)​# print(retult)​print("打印词频==============")retult = count_from_file(r'./text.txt',top_limit=10)print(retult)​​print("*"*100)​# 例子# sentence = 'Ilikeyou '# wc = wordcloud.WordCloud()# pic = wc.generate(sentence)# plt.imshow(pic)# plt.axis("off")# plt.show()​# wc.to_file('test.png')​print("分词并生成词云图")​
def create_word_cloud(file):
​ content = codecs.open(file,'r','UTF-8').read()
#     结巴分词 wordlist = jieba.cut(content) wl = " ".join(wordlist)
​ print(wl)
​
#     设置词云图 wc = wordcloud.WordCloud( #     设置背景颜色 background_color='pink', #     设置最大显示的词数 max_words=100, #     设置字体路径 font_path = 'C:\Windows\Fonts\msyh.ttc', height = 1200, width=1600, #     设置字体最大值 max_font_size=300, #     设置有多少种配色方案,即多少种随机生成状态 random_state=30, )
​ # 生成词云图 myword = wc.generate(wl)
​ # 展示词云图 plt.imshow(myword) plt.axis("off") plt.show() wc.to_file('py_pic.png')
​
# content = codecs.open("./text.txt",'r','UTF-8').read()
create_word_cloud("text.txt")
​
​ 

Python中文分词及词频统计相关推荐

  1. python统计词频_Python中文分词及词频统计

    中文分词 中文分词(Chinese Word Segmentation),将中文语句切割成单独的词组.英文使用空格来分开每个单词的,而中文单独一个汉字跟词有时候完全不是同个含义,因此,中文分词相比英文 ...

  2. python 小说词频统计_Python中文分词及词频统计

    中文分词 中文分词(Chinese Word Segmentation),将中文语句切割成单独的词组.英文使用空格来分开每个单词的,而中文单独一个汉字跟词有时候完全不是同个含义,因此,中文分词相比英文 ...

  3. python实现中文分词和词频统计

    python2.7中实现中文分词,是引入了jieba中文分词库.再进行简单的词频统计. import sys reload(sys) sys.setdefaultencoding('utf-8') i ...

  4. python字频统计软件_python结巴分词以及词频统计实例

    python结巴分词以及词频统计实例 发布时间:2018-03-20 14:52, 浏览次数:773 , 标签: python # coding=utf-8 ''' Created on 2018年3 ...

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

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

  6. python分词和词频统计

    Python大数据:jieba分词,词频统计  黑冰中国 关注 0.1 2018.03.21 11:39* 字数 1717 阅读 7553评论 6喜欢 45赞赏 1 实验目的 学习如何读取一个文件 学 ...

  7. python软件和rost软件哪个更好_ROST-CM软件分词和词频统计用法体验

    ROST作为一款优秀的内容挖掘工具,在自然语言处理上提供一系列能够快速上手使用的功能,其中"分词"功能也是广为使用的.我们在对文本进行分词处理的过程中,由于词库是固定的,所以不管是 ...

  8. 【NLP】jieba分词-Python中文分词领域的佼佼者

    1. jieba的江湖地位 NLP(自然语言)领域现在可谓是群雄纷争,各种开源组件层出不穷,其中一支不可忽视的力量便是jieba分词,号称要做最好的 Python 中文分词组件. "最好的& ...

  9. python 中文分词工具

    python 中文分词工具 jieba,https://github.com/fxsjy/jieba jieba_fast,https://github.com/deepcs233/jieba_fas ...

最新文章

  1. Vi非正常退出导致敏感信息泄露
  2. 计数时钟和滚动汉字显示c语言程序,MSP430F449单片机RTC时钟C语言程序(带闹钟)...
  3. java字符串类型常量拼接与变量拼接的区别
  4. 信息系统项目管理知识--项目整合管理
  5. Hat’s Words (分成两个字符串考虑)
  6. Android Tips – 填坑手册
  7. jquery dropload
  8. 八爪鱼批量爬取html中的数据,批量采集网页数据 - 八爪鱼采集器
  9. 确实有必要好好学英语
  10. linux中man 2与man 3区别
  11. 蓝牙耳机连接电脑,找不到stereo模式
  12. 阳光,无论清浅或明媚
  13. Saruman‘s Army
  14. javascript 实现生成GUID / UUID的多种方法
  15. ibm service guide
  16. Python安装包(3.6和3.8)及Pycharm安装及汉化包
  17. 南宁计算机技术学校排名,南宁职业技术学校,南宁职业技术学校前十名,南宁职业技术学校排名情况一览表 - IT教育频道...
  18. MMR(最大边界相关算法)
  19. python之奇数和或偶数和
  20. 怎么在navicat(Navicat for MySQL)中运行SQL代码

热门文章

  1. 新媒体营销线上线下活动策划详细方案
  2. 志愿者管理系统 php,志愿者信息管理系统
  3. 单片机STM8S测量电压电路_纸张计数测量显示装置+【2019年电赛F题国一获奖作品】...
  4. 三菱plcascll转换16进制_三菱FX系列PLC的SER指令使用方法
  5. 网络分层(7层)以及每层的设备和协议
  6. wex5 发布apk以及更新
  7. 《脚本》Python在线百度文库爬虫(免下载券)
  8. ta点读笔客户端_点读笔到底哪支好?12款点读笔评测:看完不再稀里糊涂
  9. 白苹果了怎么办_iOS 13如何降级?iOS13降级失败怎么办?
  10. UE4 Material 101学习笔记——23-29 水涟漪/水深/折射反射/Gerstner海浪/波光焦散/泡沫/FlowMap