我试图以这样一种方式来解析字符串,以便分离出所有的单词组件,甚至那些已经收缩的组件。例如,“should't”的标记化将是[“should”,“n't”]。在
nltk模块似乎无法胜任该任务,但是:"I wouldn't've done that."
标记为:['I', "wouldn't", "'ve", 'done', 'that', '.']
其中所需的“would't”标记化为:['would',“n't”,“ve”]
在研究了常见的英语缩略语之后,我试图编写一个正则表达式来完成这项工作,但是我很难弄清楚如何只匹配一次“'ve”。例如,以下标记都可以终止收缩:n't, 've, 'd, 'll, 's, 'm, 're
但是代币“'ve”也可以跟在其他缩略语之后,比如:'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"
问题似乎是第三个撇号限定为单词边界,这样最后的“'ve”标记与整个regex匹配。在
我一直想不出一种方法来区分单词边界和撇号,如果没有,我愿意接受其他策略的建议。在
另外,我很好奇是否有任何方法可以在字符类中包含单词边界特殊字符。根据Python文档,character类中的\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]+。在