Python 正则表达式 : tokenizing English contractions

标签 python regex pattern-matching nlp

我正在尝试以这样一种方式解析字符串以分离出所有单词组件,即使是那些已经收缩的组件。例如,“不应该”的标记化将是 [“应该”、“不”]。

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/

相关文章:

javascript - 解析流而不进行裁剪

python - 在python中没有收到带有套接字超时的任何数据后如何执行代码

python - 过滤字典中常见的子字典键

javascript - 正则表达式:如果 foo 是一个词或在 URL 内,则替换它

Python 模式匹配。匹配 'c[any number of consecutive a' s, b's, or c's or b's, c's, or a's etc.]t'

Java 提取子字符串

scala - 模式匹配scala中的常量表达式?

python 错误;统一码编码错误 : 'ascii' codec can't encode character u'\u2026'

python - 在 python 数据框中查找正则表达式

python - 如何将两个列表与第三个列表进行比较,如果存在匹配,则将它们分组到Python中的嵌套列表中?