我正在尝试以某种方式解析字符串,以便分离出所有单词组成部分,即使是已经缩写的单词。例如,“shouldn't”的记号化将是["should", "n't"]。
然而,nltk模块似乎无法胜任:
"I wouldn't've done that."
记号化为:
['I', "wouldn't", "'ve", 'done', 'that', '.']
而“wouldn't've”的所需记号化是:['would', "n't", "'ve"]
研究常见的英语缩写后,我正在尝试编写一个正则表达式来完成这个任务,但我很难弄清楚如何仅匹配一个“'ve”。例如,以下标记都可以终止缩写:
n't、've、'd、'll、's、'm、're
而标记“'ve”也可以跟随其他缩写,例如:
'd've、n't've和(可能)'ll've
目前,我正在试图处理这个正则表达式:
\b[a-zA-Z]+(?:('d|'ll|n't)('ve)?)|('s|'m|'re|'ve)\b
但是,这个模式也匹配了糟糕的形式:
"wouldn't've'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]+的内容是什么。
\b(?<!')[a-zA-Z]+('s|'m|'re|'ve)|(?:('ll|'d|n't)('ve)?)(?!')\b
,它目前解决了这个问题。撇号被匹配为单词边界,但是在've的开头和结尾也如此。另外,在我注意到不匹配的括号之前,我可能已经死了并去了地狱。谢谢! - Schemer