【问题标题】:Error when stripping punctuation from corpus从语料库中剥离标点符号时出错
【发布时间】:2014-10-16 18:52:13
【问题描述】:

提前感谢您的帮助。我正在尝试编写一个脚本来查看语料库,找到所有三元组并将它们连同它们的相对频率一起打印到一个 csv 文件中。我已经走了很远,但一直遇到一个问题。由于撇号,它认为连词是两个词,因此它将doesn't 拆分为doesn t,这会弄乱三元组计数。我试图通过从原始变量中删除所有标点符号来解决这个问题,我相信这只是一个包含我的语料库中所有文本的长字符串:

    raw = raw.translate(None, string.punctuation)

但这给了我一个错误,上面写着:NameError: name 'string' is not defined

但我不认为这样使用时必须定义字符串?这是否意味着 raw 不是字符串?如何解决这个问题?

#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."

【问题讨论】:

  • 你导入字符串了吗?
  • 哎呀!!谢谢你。这样做了,但现在我收到以下错误:TypeError: translate() 只需要一个参数(给定 2 个)
  • 因为你需要要么使用string.translate模块函数接受2个参数,要么使用translate字符串方法接受一个。只需删除None
  • 做到了,现在它说:TypeError: character mapping must return integer, None or unicode

标签: python string nltk


【解决方案1】:

如果您想在单词中保留撇号,另一种选择

您不必将撇号分开。只需尝试更改标记器上的正则表达式以包含撇号:

tokenizer = RegexpTokenizer(r'\w+')

尝试:

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

或者在这里看看这个回复可能会更好:

Regex to match words and those with an apostrophe

【讨论】:

  • 还有一个问题,你知道如何编写一个只用空格标记的正则表达式吗?我想不通
  • 你的意思是你想让正则表达式匹配任何东西,直到它碰到空格?在这种情况下,您可以使用由“^”表示的“匹配任何内容”表达式。这个表达式应该工作 ^\S*
【解决方案2】:

但我认为这样使用时不必定义字符串?

与 Python 中的所有其他模块一样,您需要在使用之前导入 string

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

不要将string 模块与类型字符串混淆。是的。 raw 可能是字符串类型。

如何解决这个问题?

在文件开头添加import string

【讨论】:

    【解决方案3】:

    如果您想使用标点符号,您需要导入如下标点符号:

    python3:从字符串导入标点符号

    python2:导入字符串

    此链接也可能有所帮助:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    相关资源
    最近更新 更多