2022年 11月 8日

用python实现中文词频统计

本次代码基于用python实现英文词频统计,重复部分不再赘述。

jieba库的安装

具体参考如下链接的方法
Python安装jieba库的具体步骤
我把下载的文件解压到了桌面,如下是我的操作
安装jieba的操作

注意事项

1.要注意与英文的区别,英文里要把标点替换成空格,中文里要把标点删去,而不是换成空格。为什么不用remove?因为remove只是换掉第一个出现的标点。所以还是采用replace。
2.在对列表循环的过程中执行remove操作,会产生问题。所以,在去除单个字的词的时候,我们新建了一个列表。而不是在原列表中移除单个字的词。

try_list = [1,2,1,1,3,4,1,21,1,1]
for i in try_list:
  if i == 1:
    try_list.remove(i)
print(try_list)
#1并没有删完
#[2, 3, 4, 21, 1, 1]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

若要进一步探究原因,可访问如下链接
python中remove的一些坑

实现代码

import jieba
#获得去除标点的文本
def get_text(file_name):
  with open(file_name, 'r', encoding='utf-8') as fr:
    text = fr.read()
    #要删除的标点
    del_ch = ['《',',','》','\n','。','、',';','"',\
      ':',',','!','?',' ']
    for ch in del_ch:
      text = text.replace(ch,'')#这里无需替换成空格
    return text

#文件名改为要分析的文件
file_name = 'threekingdoms.txt'
text = get_text(file_name)
vlist = jieba.lcut(text)#调用jieba实现分词,返回列表

res_dict = {}
#进行词频统计
for i in vlist:
  res_dict[i] = res_dict.get(i,0) + 1
res_list = list(res_dict.items())
#降序排序
res_list.sort(key = lambda x:x[1], reverse = True)
fin_res_list = []

#去除单个字的词
for item in res_list:
  if(len(item[0])>=2):
    fin_res_list.append(item)

for i in range(100):
  word,count = fin_res_list[i]
  pstr = str(i+1) + ':'
  print(pstr, end=' ')
  print(word,count)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

另一个版本

在最后的处理有所不同,这个主要是受老师的启发

import jieba
#获得去除标点的文本
def get_text(file_name):
  with open(file_name, 'r', encoding='utf-8') as fr:
    text = fr.read()
    #要删除的标点
    del_ch = ['《',',','》','\n','。','、',';','"',\
      ':',',','!','?',' ']
    for ch in del_ch:
      text = text.replace(ch,'')#这里无需替换成空格
    return text

#文件名改为要分析的文件
file_name = 'threekingdoms.txt'
text = get_text(file_name)
vlist = jieba.lcut(text)#调用jieba实现分词,返回列表

res_dict = {}
exclude = ['却说','不能','如何','左右','二人','不可',\
  '荆州','如此','商议','主公','军士']
#进行词频统计
for i in vlist:
  if len(i)<=1:
    continue
  elif i in exclude:
    continue
  elif i == '玄德曰':
    ri = '玄德'
  elif i == '孔明曰':
    ri = '诸葛亮'
  elif i == '孔明':
    ri = '诸葛亮'
  else:
    ri = i
  res_dict[ri] = res_dict.get(ri,0) + 1
res_list = list(res_dict.items())
#降序排序
res_list.sort(key = lambda x:x[1], reverse = True)
 

for i in range(10):
  word,count = res_list[i]
  pstr = str(i+1) + ':'
  print(pstr, end=' ')
  print(word,count)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45