当前位置:   article > 正文

7.2.1 中文分词语料库-词频统计的实现-《NLP自然语言处理原理与实践》_利用现代汉语语料库进行汉语分词和词性自动标注,并进行文本的“词频统计”

利用现代汉语语料库进行汉语分词和词性自动标注,并进行文本的“词频统计”

首先,书上的代码是基于python2的,运行起来有多处问题。需要改正如下:
1.from framework import *,这个不知道是已有的文件还是什么,反正我直接给注释掉了,也不会报错

2.from cStringIO import StringIO,改为import io

3.设置UTF-8输出环境
reload(sys)
sys.setdefaultencoding(‘utf8’)
改为
import importlib
importlib.reload(sys)

4.先略过中间的两个函数,看最下面的执行语句
①segments实际上就是放语料库的文件夹,可自行写路径
②readfile函数不存在,根据注释可以知道这代码是想把语料库读取为字符串。我们可以创建一个文件类型对象,打开路径对应的文件后进行读取,此次采取的是按行读取,实际上实现了按行分割,在后面有用。

segcorpus=readfile(rootdir+segpath)
改为
f=open(rootdir+segpath)
segcorpus=f.readlines()
③file=StringIO() 改为 file=io.StringIO()
④savefile函数不存在,根据注释可以知道这代码是想新建一个txt文件存放输出结果。我们可以创建一个文件对象(如果按路径搜索不存在就会创建一个txt出来),再进行写入。
savefile(rootdir+“freqdict.txt”,file_str.getvalue())
改为
f_result = open(rootdir+“freqdict.txt”,‘a’)
f_result.write(file_str.getvalue())
⑤把前面创建的两个文件对象关闭
f.close()
f_result.close()

5.中间两个函数和hanzi那行代码
首先两个函数第一行代码都是:sent=" “.join(fcontent.splitlines()).strip().decode(“utf-8”)
含义是读取fcontent然后按行分割,但是splitlines不存在(不知道是不是在from framework import *中),前面我们对segcorpus实现了按行读取(segcorpus=f.readlines()),也就是实现了分割了,而且是字符串的形式,不必进行decode,所以此处 不必这么麻烦,改为如下即可:
sent=” ".join(fcontent).strip()

对于第二个函数前面那行:hanzi=re.compile(ur"[\u4e00-\u9fa5]+“),目的是识别出汉字,但在python3中不用再指定u,改为r”[\u4e00-\u9fa5]+"

最后,完整能正常运行的代码如下:

import sys,os
import nltk
import re
import io
import importlib
importlib.reload(sys)

def fullfreq(fcontent,sumdict):
    sent=" ".join(fcontent).strip()
    sTuple=[ nltk.tag.str2tuple(t) for t in sent.split(" ") ]
    fredist=nltk.FreqDist(sTuple)
    print(len(fredist))
    for localkey in fredist:
        if localkey in sumdict:
            sumdict[localkey]=sumdict[localkey]+fredist[localkey]
        elif str(localkey[1]).find("None")==-1:
            sumdict[localkey]=fredist[localkey]
            
hanzi=re.compile(r"[\u4e00-\u9fa5]+")

def hanzfreq(fcontent,sumdict):
    sent=" ".join(fcontent).strip()
    sTuple=[ nltk.tag.str2tuple(t) for t in sent.split(" ") if hanzi.match(t) ]
    fredist=nltk.FreqDist(sTuple)
    print(len(fredist))
    for localkey in fredist:
        if localkey in sumdict:
            sumdict[localkey]=sumdict[localkey]+fredist[localkey]
        elif str(localkey[1]).find("None")==-1:
            sumdict[localkey]=fredist[localkey]

sumdict={}
rootdir="199801/"                      
segpath="199801.txt"
f=open(rootdir+segpath)
segcorpus=f.readlines()
fullfreq(segcorpus,sumdict)
hanzfreq(segcorpus,sumdict)
sumlist=sorted(sumdict.items(),key=lambda x:x[1], reverse=True)
file_str= io.StringIO()
for key in sumlist:
    file_str.write(str(key[0][0]));    file_str.write("\t")
    file_str.write(str(key[0][1]));    file_str.write("\t")
    file_str.write(str(key[1]));    file_str.write("\n")
f_result = open(rootdir+"freqdict.txt",'a')
f_result.write(file_str.getvalue())
print("OK")
f.close()
f_result.close()
  • 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
  • 46
  • 47
  • 48
  • 49

另外,我用的人民日报1998年1月的语料资源:
链接:https://pan.baidu.com/s/1J-2Kcf_GRVM4CVgBx21u8Q?pwd=huj1
提取码:huj1

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/508409
推荐阅读
相关标签
  

闽ICP备14008679号