如何在收缩标记化中反转正则表达式?
How to reverse the regex in contractions tokenization?
在 nlp
标记化中,缩写有时会这样拆分:
>>> import re
>>> s = 'he cannot fly'
>>> pattern, substitution = r"(?i)\b(can)(not)\b", r" "
>>> re.sub(pattern, substitution, s)
'he can not fly'
要逆转它(即去标记化),我试过这个:
>>> rev_pattern, rev_substitution = r"(?i)\b(can)\s(not)\b", r" "
>>> re.sub(rev_pattern, rev_substitution, s)
'he cannot fly'
问题是r"(?i)\b(can)\s(not)\b"
和r" "
原模式替换的反转?还有其他方法可以扭转这种局面吗?
在这种情况下,我手动将 \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' '。
你能不能在中间加个评论(?#...)
。然后做 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]
在 nlp
标记化中,缩写有时会这样拆分:
>>> import re
>>> s = 'he cannot fly'
>>> pattern, substitution = r"(?i)\b(can)(not)\b", r" "
>>> re.sub(pattern, substitution, s)
'he can not fly'
要逆转它(即去标记化),我试过这个:
>>> rev_pattern, rev_substitution = r"(?i)\b(can)\s(not)\b", r" "
>>> re.sub(rev_pattern, rev_substitution, s)
'he cannot fly'
问题是r"(?i)\b(can)\s(not)\b"
和r" "
原模式替换的反转?还有其他方法可以扭转这种局面吗?
在这种情况下,我手动将 \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' '。
你能不能在中间加个评论(?#...)
。然后做 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]