2017-09-15 6 views
0

문단이 있으며 단어와 구두점을 구분하여 토큰 화하고 그 결과를 인쇄하려고합니다. 특별한 경우가 있습니다 (예 : Peter와 같은 약어 (미국) & 및 십진수)는 문자에 첨부해야하며 구분하지 않아야합니다.약어 및 구두점 표기법에 대한 정규식 패턴

나는 다음 코드를 실행합니다 :

import re 

text = "My weight is about 68 kg, +/- 10 grams! I live in U.S.A. at Mr. 
Peter's house! 3,500 calorie rule, which equates a weight alteration 
of 2.2 lb" 

pattern = r"""(?:[A-Z]\.)+ |\d+(?:\.\d+)?%?|\w/.+$\s-|\w+(?:[-']\w+)*| 
(?:[+/\[email protected]&*]|/.$/)""" 

print (re.findall(pattern, text)) 

아웃풋 :

['My', 'weight', 'is', 'about', '68', 'kg', '+', '/', '-', '10', 
'grams', 'I', 'live', 'in', 'U.S.A. ', 'at', 'Mr', "Peter's", 'house', 
'3', '500', 'calorie', 'rule', 'which', 'equates', 'a', 'weight', 
'alteration', 'of', '2.2', 'lb' 
] 

이 코드 몇 가지 실수가있다, 나는 정말 그 문제를 해결하는 데 도움이 필요합니다

  1. 모든 구두점을 제거합니다! 나는 그 (것)들을 지키고 그러나 낱말에서 분리하고 싶다.

  2. 패턴은 contains (,)를 무시하고 제거합니다. 패턴에 \d+(?:\,\d+)?%?을 추가했지만 제대로 작동하지 않습니다. 패턴은 일부 약어 등 Mr.

가 당신의 도움이 매우 이해할 수를 무시

  • !

    +0

    전적으로 가능하다고 생각하지 않습니다. 정규 표현식에서 "미국"의 마지막 요점을 어떻게 알 수 있습니까? 문장의 끝인가요? – Emaro

    답변

    1

    정규식으로이 작업을 시도하지 말고 작업을 위해 설계된 도구를 사용하지 않는 것이 좋습니다. 다음은 U.S.A. 또한 Peter's 처리해야

    from nltk.tokenize import WhitespaceTokenizer, word_tokenize 
    
    text = "My weight is about 68 kg, +/- 10 grams! I live in U.S.A. at Mr. Peter's house! 3,500 calorie rule, which equates a weight alteration of 2.2 lb" 
    
    print WhitespaceTokenizer().tokenize(text) 
    print word_tokenize(text) 
    

    이 당신에게 다음과 같은 가능성을 줄 것이다 : 당신이 만발한 자연 언어 처리 도구와 함께 작동하지 않을 경우

    ['My', 'weight', 'is', 'about', '68', 'kg,', '+/-', '10', 'grams!', 'I', 'live', 'in', 'U.S.A.', 'at', 'Mr.', "Peter's", 'house!', '3,500', 'calorie', 'rule,', 'which', 'equates', 'a', 'weight', 'alteration', 'of', '2.2', 'lb'] 
    ['My', 'weight', 'is', 'about', '68', 'kg', ',', '+/-', '10', 'grams', '!', 'I', 'live', 'in', 'U.S.A.', 'at', 'Mr.', 'Peter', "'s", 'house', '!', '3,500', 'calorie', 'rule', ',', 'which', 'equates', 'a', 'weight', 'alteration', 'of', '2.2', 'lb'] 
    
    +0

    그래,이 도구를 확실히 사용할 것이지만 출력에 실수가있다. 구두점은 '그램!'입니다. 그리고 '집!' 낱말에서 유출되어야한다. 올바른 출력은 '그램', '!', '하우스', '!' 이 경우 정규식을이 코드와 함께 사용할 수 있습니까? –

    +0

    대안으로'word_tokenize()'를 조사 할 수도 있습니다. 스크립트를 업데이트했습니다. –

    +0

    업데이트 주셔서 감사합니다. 두 번째 산출물의 문제는 피터 (Peter)라는 이름의 아포스트로피가 분리되어 있다는 사실입니다.'Peter', " 's" –

    0

    를, 내가 제안 좀 더 간단한 패턴으로 작업하고 일부 구문 분석 정리를 계획하십시오. 을 해결하려고하면 패턴 일치 내 모든 문자가이고 까다 롭고 새로운 구문 요소가 도입되면 계속 실패 할 수 있습니다. re.findall()보다

    ['My', 'weight', 'is', 'about', '68', 'kg', ',', '+/-', '10', 'grams', 
    '!', 'I', 'live', 'in', 'U.S.A.', 'at', 'Mr.', "Peter's", 'house', '!', 
    '3,500', 'calorie', 'rule', ',', 'which', 'equates', 'a', 'weight', 
    'alteration', 'of', '2.2', 'lb'] 
    

    오히려

    import re 
    
    text = "My weight is about 68 kg, +/- 10 grams! I live in U.S.A. at Mr. Peter's house! 3,500 calorie rule, which equates a weight alteration of 2.2 lb" 
    
    pattern = r"(\s+|(?:[A-Z']\.?)+)" 
    
    tokens = [token for token in re.split(pattern, text, flags=re.I) if token and not token.isspace()] 
    
    print(tokens) 
    

    OUTPUT, 내가 토큰을 분리하는 패턴 유지와 re.split()을 사용하고 있습니다 말했다, 여기에 내가 당신을 해당 예외의 대부분이 처리 믿고 단순한 패턴 방식이다 (예 : 단어 분리). 새로운 예외가 발생하면 패턴을 복잡하게 만들지 또는 사전 또는 사후 분석으로 처리 할 수 ​​있는지 여부를 평가합니다.

    +0

    코드를 작성해 주셔서 감사합니다. 그것은 내가 원하는 결과물로 잘 작동한다. 나는 nltk.tokenize를 사용하기를 원한다면 궁금합니다. 정규식을 사용해야합니까? 또는 코드가 훨씬 더 간단합니다 –

    +0

    패턴 regexp_tokenize (text, pattern = ("\ s + | (? : [A-Z '] \.?) +"))와 함께 nltk & python 3을 사용했지만, 이 [ 'M', ', ', ', ', ', ', ', ', ', 'I '는, ' ' ', ', 'USA ' ', ', 'M ', ', 'P', " '", ', ' ' ', ', ', ', ', ', ', ', ', '] –

    +0

    @BeautifulMind 난에 명시된 바와 같이 내 설명, 내 패턴은 re.split()', 다른 정규식 함수와 다르게 패턴을 적용하고 빈 문자열과 공백을 제거하는 이해에 따라 설계되었습니다. 'regexp_tokenize()'함수는 패턴을 다른 방식으로 적용합니다. [regexp_tokenize() 소스 파일 맨 위에있는 코드 주석에 요약되어 있습니다.] (http://www.nltk.org/_modules/nltk/tokenize/ regexp.html) – cdlane