以下解决方案在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)
答案 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世纪(实际上他们可能说不是那个即使他们写了不是那个)。现在的英语是,这并不让你感到惊讶。