如何在收缩标记化中反转正则表达式?

时间:2017-05-03 02:58:52

标签: python regex nlp tokenize substitution

nlp标记化中,收缩有时会被分开:

>>> import re
>>> s = 'he cannot fly'
>>> pattern, substitution  = r"(?i)\b(can)(not)\b", r" \1 \2 "
>>> re.sub(pattern, substitution, s)
'he  can not  fly'

为了扭转这种局面(即宣告化),我试过这个:

>>> rev_pattern, rev_substitution  = r"(?i)\b(can)\s(not)\b", r" \1\2 "
>>> re.sub(rev_pattern, rev_substitution, s)
'he cannot fly'

问题是r"(?i)\b(can)\s(not)\b"r" \1\2 "与原始模式替换相反?还有其他方法可以扭转这种局面吗?

在这种情况下,我已将\s手动编码为模式。主要问题是这些正则表达式中有一堆是手动编码用于标记化的,我还要为所有这些正则手动添加\s

CONTRACTIONS2 = [re.compile(r"(?i)\b(can)(not)\b"),
                 re.compile(r"(?i)\b(d)('ye)\b"),
                 re.compile(r"(?i)\b(gim)(me)\b"),
                 re.compile(r"(?i)\b(gon)(na)\b"),
                 re.compile(r"(?i)\b(got)(ta)\b"),
                 re.compile(r"(?i)\b(lem)(me)\b"),
                 re.compile(r"(?i)\b(mor)('n)\b"),
                 re.compile(r"(?i)\b(wan)(na) ")]
CONTRACTIONS3 = [re.compile(r"(?i) ('t)(is)\b"),
                 re.compile(r"(?i) ('t)(was)\b")]
CONTRACTIONS4 = [re.compile(r"(?i)\b(whad)(dd)(ya)\b"),
                 re.compile(r"(?i)\b(wha)(t)(cha)\b")]

有没有办法自动遍历正则表达式列表并在组之间添加\s而无需对去标记正则表达式进行硬编码

我知道原始的标记化替换是 - >的r' \ 1 \ 2',为了撤消这一点,我将其改回r' \ 1 \ 2'。

1 个答案:

答案 0 :(得分:2)

你可以在两者之间加上评论pattern.replace。然后执行PATTERNS = [r"(?i)\b(can)(?#A)(not)\b", r"(?i)\b(d)(?#A)('ye)\b", r"(?i)\b(gim)(?#A)(me)\b", r"(?i)\b(gon)(?#A)(na)\b"] CONTRACTIONS = [re.compile(x) for x in PATTERNS] REVERSORS = [re.compile(x.replace('(?#A)', '\s')) for x in PATTERNS]

e.g:

{{1}}