2011-09-10 3 views
2

많은 단어의 철자 변형이 포함 된 텍스트 파일이 있습니다.파이썬 : 텍스트 파일 표준화

예 :

identification ... ID .. identity...contract.... contr.... contractor...medicine...pills..tables 

그래서 나는 단어의 동의어를 포함하고 기본 단어로 모든 변종을 대체하려는 동의어 텍스트 파일을 갖고 싶어. 본질적으로 나는 입력 파일을 정규화하고 싶다.

는 예컨대을 내 동의어 목록 파일 내가 최종 출력 파일은 내가 파이썬 프로그래밍을 가지고 어떻게

identification ... identification .. identification...contractor.... contractor.... contractor...medicine...medicine..medicine 

같이 할

identification = ID identify 
contracting = contract contractor contractors contra...... 
word3 = word3_1 word3_2 word3_3 ..... word3_n 
. 
. 
. 
. 
medicine = pills tables drugs... 

과 같을 것이다?

도움을 주셔서 감사합니다.

답변

3

를 보라 :

import re 

table={} 
with open('synonyms','r') as syn: 
    for line in syn: 
     match=re.match(r'(\w+)\s+=\s+(.+)',line) 
     if match: 
      primary,synonyms=match.groups() 
      synonyms=[synonym.lower() for synonym in synonyms.split()] 
      for synonym in synonyms: 
       table[synonym]=primary.lower() 

print(table) 

{'word3_1': 'word3', 'word3_3': 'word3', 'word3_2': 'word3', 'contr': 'contracting', 'contract': 'contracting', 'contractor': 'contracting', 'contra': 'contracting', 'identify': 'identification', 'contractors': 'contracting', 'word3_n': 'word3', 'ID': 'identification'} 
을 수득

다음으로, 텍스트 파일에 읽고, table에서 그 차의 동의어 각 단어를 대체 할 수 :

with open('textfile','r') as f: 
    for line in f: 
     print(''.join(table.get(word.lower(),word) 
         for word in re.findall(r'(\W+|\w+)',line))) 

identification  identification identity contracting  contracting  contracting medicine medicine medicine 

  1. re.findall(r'(\w+|\W+)',line) 분할 각 line 동안 사용되었다 산출 공백을 보존합니다. 공백에 관심이 없다면 도 더 쉽게 사용할 수 있습니다 line.split().
  2. table.get(word,word) 반환 table[word] 단어가 table, 에 단순히 wordword 경우는 동의어 table에없는 반환하는 경우.
+0

공백 분할은 뒤에 오는 구두점을 추가합니다 (예 : "내 ID 표시"). 공백으로 나누면 "ID"로 변환 할 좋은 "ID"문자열을 제공하지 않습니다. 대/소문자도 처리해야합니다. – PaulMcG

+1

@Paul McGuire : 의견을 보내 주셔서 감사합니다. 구두점을 단어와 구별하기 위해'\ s + | \ S +'를'\ w + | \ W +'로 변경하고 대소 문자를 처리하기위한 코드를 추가했습니다. @Pradeep : 동의어 목록에 구두점이있는 단어는 더 이상 일치하지 않으며 대문자와 함께 의미가 바뀌는 단어 ('폴란드어'는 국적이지만 '폴란드어' '동사)는 동일한 동의어로 대체 될 수 있습니다.이러한 문제는 더 많은 코드로 처리 할 수 ​​있지만 상황에 영향을 미치지 않는 한 그렇게하지 않겠습니다. – unutbu

+0

폴 감사합니다. 코드가 의도 한대로 작동합니다. – Zenvega

3

그냥 생각 대신, 단어의 모든 변화의 목록을 갖는은 table, 당신은 동의어 파일을 읽고 사전으로 변환 할 수 difflib

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy']) 
['apple', 'ape'] 
>>> import keyword 
>>> get_close_matches('wheel', keyword.kwlist) 
['while'] 
>>> get_close_matches('apple', keyword.kwlist) 
[] 
>>> get_close_matches('accept', keyword.kwlist) 
['except'] 
+0

감사합니다.이 유형의 휴리스틱 스크러빙이 필요합니다. 필자는 작업중인 응용 프로그램의 약간 더 발전된 단계에서이 문제를 조사하려고합니다. – Zenvega