今天介绍一下Python中第三方库-Jieba库的使用
有时候我们是需要对文本中的单词的频率进行统计的
#单词出现频率的统计
#将文本进行处理
def getText():
txt = open("text.txt","r").read() # 打开并读取所有的文件
txt = txt.lower() # 将文本中的所有字母都改成小写
for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_’‘{|}~': # 将文本中的特殊符号都用空格替代
txt = txt.replace(ch," ")
return txt # 返回文章的所有内容
hamletTxt=getText()
words = hamletTxt.split() #默认采用空格将字符串中的信息进行分隔
#定义字典类型
counts = {} # 新建立一个空的字典
for word in words: # 循环遍历所有的单词
counts[word] = counts.get(word,0)+1 # 返回word这个键对应的值,只要是出现的单词都默认值为 1,下次如果再遇到就加一
items = list(counts.items()) # 将字典中的值都放入列表中,这个时候应该是一个元组类型的列表
#对列表大到小排序
items.sort(key=lambda x:x[1],reverse=True) # lambda关键字表示按照后面指定的方式进行排序,这里表示元组中的第二个元素,也就是单词出现的次数
for i in range(20): # 循环的打印出出现频率最高的前20个单词
word,count = items[i]
print("{0:<10}{1:>5}".format(word,count))#word宽度为10字符在左边,count宽度为5字符在右边
从上面的代码可以看出文件的处理其实并不算是很复杂,但是细心的同学或许能够发现这样的做法是不能分割长句的,例如“中国特色社会主义国家”,如果这种方式提取出来的,只能是这一整句话,但是我们所熟悉的词组,却不是这么定义的,我们期望的是计算机能够给我分割出:“中国”、“特色”、“社会主义”、“国家”等词汇,所以有没有更简便、更高效、更准确的词组处理方式呢,这个时候就要用到Python优秀的第三方库——Jieba库
首先我们看看jieba库的简介和安装方式
该页面地址:Jieba简介
然后然后我们来看看jieba库的使用
#引用jieba库
import jieba
txt = open("threekingdoms.txt","r",encoding="utf-8").read() #用utf-8的编码形式读取txt文件,因为jieba是一个中文分词库
words = jieba.lcut(txt) #用jieba库的精确模式将txt装换成列表的格式
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:<5}{1:>5}".format(word,count))
很显然,运用了jieba库之后我们处理就变得很简单了,我们只需要对分割的词组进行筛选处理即可
import jieba #引用jieba库
txt = open("threekingdoms.txt","r",encoding="utf-8").read() #用utf-8的编码形式读取txt文件
excludes = {"将军","却说","荆州","二人","不可","不能","如此","商议","如何","军士","左右","军马","主公"\
,"引兵","次日","大喜","天下","东吴","于是","今日","不敢","魏兵","陛下","一人","都督","人马","不知"\
} # 删掉不必要的词
words = jieba.lcut(txt) #用jieba库的精确模式将txt装换成列表的格式
counts = {} # 建立一个空的字典
for word in words:
if len(word) == 1: #单个的词不计数
continue
elif word == "诸葛亮" or word == "孔明曰": #将含义相同的词语进行规范化
rword = "孔明"
elif word == "关公" or word == "云长":
rword = "关羽"
elif word == "玄德" or word == "玄德曰":
rword = "刘备"
elif word == "孟德" or word == "丞相":
rword = "曹操"
else:
rword = word
counts[rword] = counts.get(rword,0)+1 #出现一次就+1
for word in excludes: # 将不必要的词从记录中删除
del counts[word]
items = list(counts.items()) #将counts的键值对返回并生成列表
items.sort(key=lambda x:x[1], reverse=True)#将键值对列表进行由大到小排序
for i in range(15):
word,count = items[i]
print("{0:<5}{1:>5}".format(word,count))
有兴趣的同学可以深入的学习Jieba库的使用,他真的是一个很好用的中文分词库。