2017-05-03 1 views
0

이 수축 가끔 같은 분할됩니다수축 토큰 화에서 정규식을 뒤집는 방법은 무엇입니까? <code>nlp</code> 토큰에서

>>> 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' 

을 바꾸려면 (즉 detokenization), 나는 시도했다이 :

>>> 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 "는 IS 원래의 패턴 치환의 반대? 이것을 뒤집을 다른 방법이 있습니까?

이 경우 패턴에 \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을 추가했습니다 regexes를 추가하고 제트 변형 정규 표현식을 하드 코드하지 않고 그룹간에 \s을 추가하십시오.

원래의 토큰 화 대체는 ->`r '\ 1 \ 2'이므로이를 취소하려면 다시 변경해야합니다. r '\ 1 \ 2'.

답변

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] 
관련 문제