从语料库中去除标点时出错
谢谢你提前的帮助。我正在尝试写一个脚本,这个脚本会查看一大堆文本,找到所有的三元组(就是连续的三个词),并把这些三元组和它们的相对频率打印到一个csv文件里。我已经做得差不多了,但总是遇到一个问题。它把连词当成两个词来处理,因为有个撇号,所以把 doesn't
分成了 doesn t
,这就搞乱了三元组的计数。我想通过从原始变量中去掉所有标点符号来解决这个问题,我认为这个变量就是一个长长的字符串,里面包含了我所有文本的内容,我用这行代码来实现:
raw = raw.translate(None, string.punctuation)
但是这给我报了一个错,提示是:NameError: name 'string' is not defined
我本以为像这样用的时候不需要定义字符串?这是不是意味着原始变量不是一个字符串?我该怎么解决这个问题呢?
#this imports the text files in the folder into corpus called speeches
corpus_root = '/Users/root'
speeches = PlaintextCorpusReader(corpus_root, '.*\.txt')
print "Finished importing corpus"
tokenizer = RegexpTokenizer(r'\w+')
raw = speeches.raw().lower()
raw = raw.translate(None, string.punctuation)
finalwords = raw.encode['ascii','xmlcharrefreplace']
tokens = tokenizer.tokenize(finalwords)
tgs = nltk.trigrams(tokens)
fdist = nltk.FreqDist(tgs)
minscore = 40
numwords = len(finalwords)
print "Words in corpus:"
print numwords
c = csv.writer(open("TPNngrams.csv", "wb"))
for k,v in fdist.items():
if v > minscore:
rf = Decimal(v)/Decimal(numwords)
firstword, secondword, thirdword = k
trigram = firstword + " " + secondword + " " + thirdword
results = trigram,v,rf
c.writerow(results)
print firstword, secondword, thirdword, v, rf
print "All done."
3 个回答
0
如果你想使用标点符号,你需要像下面这样导入标点符号:
在python3中:from string import punctuation
在python2中:import string
这个链接也可能对你有帮助:
0
但我觉得像那样用的时候不需要定义字符串吧?
和Python里的其他模块一样,你在使用之前需要先导入string模块。
那这是不是意味着raw不是字符串?
不要把raw
可能是字符串类型。
那我该怎么解决这个问题呢?
在文件的开头加上import string
。
0
如果你想在单词中保留撇号,还有另一种选择。
你不一定要把撇号分开。可以尝试修改你的分词器中的正则表达式,让它包含撇号:
tokenizer = RegexpTokenizer(r'\w+')
试试这个:
tokenizer = RegexpTokenizer(r'(\w|')+')
或者你也可以看看这里的回答,可能会更好: