赞
踩
首先,书上的代码是基于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()
另外,我用的人民日报1998年1月的语料资源:
链接:https://pan.baidu.com/s/1J-2Kcf_GRVM4CVgBx21u8Q?pwd=huj1
提取码:huj1
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。