如何获得一个精确的单词匹配来转换单词重新使用下面的解决方案?

时间:2018-01-28 22:39:56

标签: python nlp nltk

以下解决方案在Stack Overflow上提供:expanding-english-language-contractions-in-python

对于宫缩来说,很好。我试图扩展它以处理俚语,但遇到了以下问题。此外,我更倾向于使用1个解决方案来处理所有单词转换(例如:扩展,俚语等)。

我将contractions_dict扩展为正确的俚语,请参阅下面的第3条:

contractions_dict = {
     "didn't": "did not",
     "don't": "do not",
     "ur": "you are"
 }

然而,当我这样做的时候,包括俚语一词(你),如#34;惊喜"我得到了

" syou areprise"

"你" """上面嵌入的是" ru"用来做。

如何在contractions_dict中的某个键上获得完全匹配

在下面的代码中,我尝试在"替换"周围嵌入一个更精确的单词匹配正则表达式。函数但收到错误" TypeError:必须是str,而不是函数"。

代码:

import re

contractions_dict = {
     "didn't": "did not",
     "don't": "do not",
     "ur": "you are"
 }

contractions_re = re.compile('(%s)' % '|'.join(contractions_dict.keys()))
def expand_contractions(s, contractions_dict=contractions_dict):
    def replace(match):
        return contractions_dict[match.group(0)]
    return contractions_re.sub(replace, s)

result = expand_contractions("surprise")
print(result)

# The result is "syou areprise".

# ---
# Try to fix it below with a word match regex around the replace function call. 

contractions_re = re.compile('(%s)' % '|'.join(contractions_dict.keys()))
def expand_contractions(s, contractions_dict=contractions_dict):
    def replace(match):
        return contractions_dict[match.group(0)]
    return contractions_re.sub(r'(?:\W|^)'+replace+'(?!\w)', s)

# On the line above I get "TypeError: must be str, not function"

result = expand_contractions("surprise")
print(result)

1 个答案:

答案 0 :(得分:1)

你的问题是replace是一个函数的名称,你试图将它连接到一个字符串,这就是为什么这个

return contractions_re.sub(r'(?:\W|^)'+replace+'(?!\w)', s)

正在向您报告您报告的错误。当您致电sub()时,您可以 提供替换字符串,要调用的函数的名称,但是您无法将这两种方法结合起来你正试图这样做。

我会回到你提供sub()函数的原始方法。我认为你缺少的是特殊的正则表达式序列\b。它匹配空字符串,但仅限于字边界。像这样:

contractions_re = re.compile("|".join(r'(\b%s\b)' % c for c in contractions_dict.keys()))

这给出了以下重新模式:

r"(\bdidn't\b)|(\bdon't\b)|(\bur\b)"

这样可以避免讨厌的syou areprise。请注意r'...'字符串表示法。你需要它,以便反斜杠不会让你失望。

这适用于字符串中的多个标记,因为它应该:

>>> expand_contractions("didn't that surprise you")
'did not that surprise you'

但这样做也表明了收缩的逐个令牌替换的局限性。要开始一个问题不是 非常 19世纪(实际上他们可能说不是那个即使他们写了不是那个)。现在的英语是,这并不让你感到惊讶