单文本分析--词频统计

任务说明:读取单个或多个文本内容(txt,word,pdf),对文章进行分词(中文),并统计每个词语出现的次数并按从大到小排序。同时通过停用词库排除停用词,并展示结果读取单个文本内容(txt,word,pdf),对文章进行分词(中文),并统计每个词语出现的次数并按从大到小排序。同时通过停用词库排除停用词。

需要掌握的知识:
(1)掌握自然语言分析的基本术语:词频,停用词
(2)jieba模块的使用
(3)collections模块Counter函数
(4)读取不同格式文本的方法

知识覆盖
(1)词频:指某一个给定的词语在该文件中出现的次数
停用词:停用词是指在信息检索中,对于结果或目的 无意义,无作用的词或词组。如‘的’,‘了’,‘是’等。这些停用词都是人工输入、非自动化生成的,生成后的停用词会形成一个停用词表。
(2)jieba模块
Python中文分词组件
分词:
待分词的字符串可以是unicode或UTF-8字符串,GBK字符串。注意:不建议直接输入GBK字符串,可能会错误地解码成UTF-8

  1. jieba.cut ()方法接受三个输入参数:需要分词的字符串; cut_all参数用来控制是否采用全模式; HMM参数用来控制是否使用HMM模型
  2. jieba.cut_for_search() 方法接受两个参数:需要分词的字符串;是否使用HMM模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细
  3. jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode),或者用jieba.lcut 以及 jieba.lcut_for_search 直接返回 list
  4. jieba.Tokenizer(dictionary=DEFAULT_DICT) 新建自定义分词器,可用于同时使用不同词典。jieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。
    更多详情及例子可参见:https://github.com/fxsjy/jieba

(3)读取不同格式文本的方法:
参见我的另一篇博客,嘿嘿:python读写不同格式文本方法

(4)词频统计:
jieba模块返回的是一个,我们可以把它理解成一个list对象,直接打印generator会得到一个地址,但对generator的处理会比list更快。
这里我们直接对使用jieba得到的generator对象使用
'空格'.join(generator对象) #将generator对象以空格连接生成一个新的字符串
这样我们就能得到一个以空格分割每个词语的字符串,可以通过自己定义词频统计函数或者使用collections库中的Counter函数就可以得到每个词的词频

对generator的详细说明建议参见廖雪峰python generator

(5)python词频排序方式:
我找到三种关于python排序的方式(都需要将数据做词频统计后并化为字典的形式),经过数据实验,其速度都差不多,大家可以按需使用,
1.python自带sorted函数
sorted函数的使用多,这里只介绍对字典和固定格式的排序

result=sorted(字典名.items(),key=lambda k:k[1],reverse=True)
#按照value值降序排列。reverse=True表示逆序。key=lambda k:k[1]表示需要用到参数key关键词,lambda是一个隐函数,是固定写法,k:k[1]表示利用第二个元素进行排序
#返回类型是列表里面嵌套元组

2.collections库Counter函数

import collections
sorted_words_dict = collections.Counter(字典名)   #统计词频
result = sorted_words_dict.most_common(100)		#前100出现频率最高的元素以及他们的次数,返回类型是列表里面嵌套元组

3.pythom堆排序模块heapq

import heapq
result=heapq.nlargest(100,字典名.items(),key=lambda k:k[1])   #返回前100出现频率最高的元素以及他们的次数,其余参数含义与sorted函数意义一致
#返回类型是列表里面嵌套元组

这几种排序方式在这里都只做简单介绍,建议重点掌握collections.Counter()相关的使用即可

代码及结果展示:
环境:我们将读取python文件同目录下的text.txt文本,对其进行分词(中文),并统计每个词语出现的次数并按从大到小排序。同时通过同目录下停用词库stop.txt排除停用词。
text.txt中的内容:
单文本分析--词频统计_第1张图片
停用词库stop.txt中内容:
单文本分析--词频统计_第2张图片
只需要与以上格式一致即可。

import jieba
import os
import collections   
import heapq	#堆排序模块

def count_word(classstr):    #自定义词频统计函数,接收参数str,返回词频字典
    result={}
    for word in classstr.split():
        if word not in result:
            result[word]=0
        result[word]+=1
    return result

def delstopwordslist(classsstr):  #去掉str中与stop.txt中相同的词,接收参数str,返回str
     stopwords = [line.strip() for line in open('stop.txt', encoding='UTF-8').readlines()]
     outstr = ''.join([word for word in classsstr if word not in stopwords])
     return outstr
     
if __name__ == '__main__':
	with open('text.txt', 'r',encoding='UTF-8')as f:  #读取text.txt文本中的内容
    	fullText=f.read().strip()   #.read()表示全部读取,.strip()表示去除每一句开头和结尾的空格和换行符

	fullText=delstopwordslist(fullText)  #调用去停用词函数
	seg_list = jieba.cut(fullText)  

	sorted_words_dict = collections.Counter(seg_list) #利用Counter()函数进行词频统计
	#sorted_words_dict =count_word(' '.join(seg_list))   #利用自定义词频统计函数

	result=sorted_words_dict.most_common(100)  #利用Counter()返回对象的.most_common()方法获取排序后的列表
	#result=sorted(sorted_words_dict.items(),key=lambda k:k[1],reverse=True)  #sorted方式进行排序
	#result=heapq.nlargest(100,sorted_words_dict.items(),key=lambda k:k[1])	#heapq方式进行排序

	print(result)

运行结果:
单文本分析--词频统计_第3张图片

你可能感兴趣的:(文本处理,词频统计,词频排序,jieba分词,Counter,文本处理)