我正在尝试以这样一种方式解析字符串以分离出所有单词组件,即使是那些已经收缩的组件。例如,“不应该”的标记化将是 [“应该”、“不”]。
nltk 模块似乎不能胜任这项任务:
"I wouldn't've done that."
标记为:
['I', "wouldn't", "'ve", 'done', 'that', '.']
“wouldn't've”所需的标记化是:['would', "n't", "'ve"]
在检查了常见的英语缩写之后,我试图编写一个正则表达式来完成这项工作,但我很难弄清楚如何只匹配一次“'”。例如,以下标记都可以终止收缩:
n't, 've, 'd, 'll, 's, 'm, 're
但是标记“'”也可以跟在其他缩略语之后,例如:
'd've, n't've, and (conceivably) 'll've
目前,我正在尝试处理这个正则表达式:
\b[a-zA-Z]+(?:('d|'ll|n't)('ve)?)|('s|'m|'re|'ve)\b
然而,这种模式也匹配格式错误的:
"wouldn't've've"
问题似乎是第三个撇号符合单词边界的条件,因此最后的“'”标记匹配整个正则表达式。
我一直想不出一种方法来区分单词边界和撇号,如果做不到这一点,我愿意听取有关替代策略的建议。
另外,我很好奇是否有任何方法可以在字符类中包含单词边界特殊字符。根据 Python 文档,字符类中的\b 匹配退格键,似乎没有办法解决这个问题。
编辑:
这是输出:
>>>pattern = re.compile(r"\b[a-zA-Z]+(?:('d|'ll|n't)('ve)?)|('s|'m|'re|'ve)\b")
>>>matches = pattern.findall("She'll wish she hadn't've done that.")
>>>print matches
[("'ll", '', ''), ("n't", "'ve", ''), ('', '', "'ve")]
我想不出第三场比赛。特别是,我刚刚意识到如果第三个撇号匹配前导\b,那么我不知道什么会匹配字符类 [a-zA-Z]+。
最佳答案
您可以使用以下完整的正则表达式:
import re
patterns_list = [r'\s',r'(n\'t)',r'\'m',r'(\'ll)',r'(\'ve)',r'(\'s)',r'(\'re)',r'(\'d)']
pattern=re.compile('|'.join(patterns_list))
s="I wouldn't've done that."
print [i for i in pattern.split(s) if i]
结果:
['I', 'would', "n't", "'ve", 'done', 'that.']
关于Python 正则表达式 : tokenizing English contractions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28054337/