Python自然语言处理—统计词频

一 数据的预处理

本文所有的例子我都将使用中文文本进行,所以在分析前需要对中文的文本进行一个预处理的过程(暂时只用的分词,去除停用词的部分后面介绍)

# -*- coding:utf-8 -*-
from nltk import FreqDist
import jieba
import pymssql

# 我的数据来源于数据库,用的是爬虫的小学数学题
conndb = pymssql.connect(host=".", user="**", password="****", database="JD")
cursor = conndb.cursor()
cursor.execute("SELECT TOP 2000 [题目] FROM [JD].[dbo].[题库]")
rows = cursor.fetchall()


#将200道题目中文分词后,并放到一个List中
text = []
for line in rows:
    content = list(jieba.cut(line[0]))
    for word in content:
        text.append(word)

结果如下图所示,可以看到有很多标点符号和单个无意义数字


二 频率分布

fdist1 = FreqDist(text)  # 生成词频的字典,格式(“词1”:数量,“词2”:数量...)
vocabulary1 = fdist1.keys()  # 字典的Key,就是所有的词
print(list(vocabulary1)[0:10])  # 词的前10个是什么,注意字典的Keys是乱序的所有前10并不是数量最多的top10
for word,num in fdist1.items():  # 如果想看看字典内到底是什么,可以运行这个循环
    print(word,num)

结果如下图

那么如何获得出现数量最多的Top10词语呢?

f = zip(fdist1.keys(),fdist1.values())  # 将字典压缩成list[('词1',num1),('词2',num2),...]
sortf = list(sorted(f,key=lambda s: s[1], reverse=True))  # f按照num排序
for i in range(10):  
    print(sortf[i])

结果如下,这就是不去除停用词的后果,得到的top10都是无意义的词。

低频的词可以一行代码获取到

fdist1.hapaxes()

三 细粒度的选择词

利用for循环和条件判断对词进行筛选,但是是用一行代码实现,这在python中叫列表解析。

代码可以理解成 循环V中所有词,如果词长度大于4,就把词放到一个List中,最终所有长度大于4的词组成了Long_words

V=set(text) #文本去重
long_words = [w for w in V if len(w)>4]
print(long_words)

结果如下,很明显本次使用的数据集除了要剔除停用词,对于全数字全英文的词也应该做剔除操作

列表解析后的判断可以是多个条件

print([w for w in V if len(w)>2 and fdist1[w]>10])

通过多个条件筛选出的值更具有代表意义,代表着这个文本的特征


四 其他——词长的分布

fdist = FreqDist([len(w) for w in text])
fdist.items()
fdist.max()  # 数量最多的词长度
fdist[1]  # 长度为1的词的数量
fdist.freq(1) # 长度为1的词的频率
fdist.tabulate() # 生成分布表

首先将每个词的长度放到一个List中,接着调用FreqDist即可

猜你喜欢

转载自blog.csdn.net/m0_38126215/article/details/83582697