一 数据的预处理
本文所有的例子我都将使用中文文本进行,所以在分析前需要对中文的文本进行一个预处理的过程(暂时只用的分词,去除停用词的部分后面介绍)
# -*- 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即可