从语料库中去除标点时出错

0 投票
3 回答
2206 浏览
提问于 2025-04-28 00:10

谢谢你提前的帮助。我正在尝试写一个脚本,这个脚本会查看一大堆文本,找到所有的三元组(就是连续的三个词),并把这些三元组和它们的相对频率打印到一个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

这个链接也可能对你有帮助:

https://www.geeksforgeeks.org/string-punctuation-in-python/

0

但我觉得像那样用的时候不需要定义字符串吧?

和Python里的其他模块一样,你在使用之前需要先导入string模块。

那这是不是意味着raw不是字符串?

不要把模块和字符串类型搞混。是的,raw可能是字符串类型。

那我该怎么解决这个问题呢?

在文件的开头加上import string

0

如果你想在单词中保留撇号,还有另一种选择。

你不一定要把撇号分开。可以尝试修改你的分词器中的正则表达式,让它包含撇号:

tokenizer = RegexpTokenizer(r'\w+')

试试这个:

tokenizer = RegexpTokenizer(r'(\w|')+')

或者你也可以看看这里的回答,可能会更好:

匹配单词和带撇号的单词的正则表达式

撰写回答