#CalHamletV1.py
英文文本除了有空格,还有冒号、感叹号等,首先要将文本噪音处理、归一化
提取每一个单词为第一步骤
之后进一步统计词频数量
代码与文本要在同一目录下
def getText():
txt=open("hamlet.txt", "r").read() #打开文件
txt=txt.lower() #避免大小写影响,将所有字母变为小写
#利用空格替换文本中的特殊符号
for ch in '!"#$%&()*+,-./:;<=>?@[\\]^‘’_{|}·~':
txt=txt.replace(ch, " ")
return txt
hamletTxt=getText()
words=hamletTxt.split() #**以空格分隔并形成列表**
记住split()函数,例如英文文本以空格作为每个单词的分隔符,使用这个函数就可以利用空格进行分词
#定义字典类型来表示单词与出现频率之间的映射关系
counts={}
for word in words:
counts[word]=counts.get(word,0)+1
#将字典类型变为列表类型,便于操作
dict.items()函数返回可遍历的键值元组数据
list(dict.items())以列表形式返回可遍历的(键值)元组数据
items=list(counts.items())
#列表排序
sort() 函数用于对原列表进行排序,如果指定参数,则使用比较函数指定的比较函数。
list.sort(cmp=None, key=None, reverse=False)
cmp – 可选参数, 如果指定了该参数会使用该参数的方法进行排序。
key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse – 排序规则,reverse = True 降序, reverse = False 升序(默认)。
对一个列表按照键值对的两个元素的第二个元素进行排序,由大到小排序
items.sort(key=lambda x:x[1],reverse=True)
#将出现次数最多的前十个次以及对应词频打印出来
for i in range(10):
word,count=items[i]
print("{0:<10}{1:>5}".format(word,count))
CalThreeKingdomsV1.py
#《三国演义》为中文词频,可以使用jieba进行分词
中文不存在大小写问题
利用jieba库不存在标点符号问题
import jieba
txt=open("three kingdoms.txt","r",encoding="utf-8").read()
words=jieba.lcut(txt) #分词处理,形成带有所有单词的列表words
counts={} #构建字典
for word in words: #逐一遍历所有单词
if len(word)==1:
continue
else:
counts[word]=counts.get(word,0)+1 #通过字典计数
#将带有计数的字典转换为列表类型,进一步排序
items=list(counts.items())
items.sort(key=lambda x:x[1],reverse=True)
#打印输出前十五位
for i in range(15):
word,count=items[i]
print("{0:<10}{1:>5}".format(word,count))
将词频与人物相关联,面向问题改造程序
CalThreeKingdomsV2.py