2013-05-26 2 views
4

나는 보도 언어에서 NLP를위한 파이썬 2.7을 사용하고, 나는에 중지 단어의 목록을 만든 중지 단어 제거하는 과정에서파이썬 정규식 모듈

(Devnagari 스크립트 사용) 개행 ("\ n")으로 구분 된 파일. 코덱 모듈을 사용하여이 파일을 읽고 목록으로 변환했습니다.

def addWordBoundary(word):  
    return u''.join(r"\b" + word + r"\b") 

reg = regex.compile(r"(%s)" % "|".join(map(addWordBoundary, stopWords)), regex.UNICODE) 

내가 코퍼스 (텍스트 파일)을 읽을 코덱 모듈을 사용하여 문자열과 regex.sub (에) 한 다음 쓰기 :

raw_txt = codecs.open('stopwords.txt', 'r', 'utf-8') 
stopWords = [] 
while(1): 
    line = raw_txt.readline() 
    if not line: 
     break 
    line = u''.join(line.strip()) 
    stopWords.append(line) 

는 지금은 일치하는 단어를 찾을 수있는 정규 표현식을 컴파일 코덱을 사용하여 파일 자체. 그러나 그것은 몇 마디를 놓쳤습니다. 나는 이유를 알 수 없었다.

fl = codecs.open('corpus.txt', 'r', 'utf-8') 
rawFile = fl.read() 

cleanText = reg.sub('', rawFile, regex.U) 

wr = codecs.open('output.txt', 'w', 'utf-8') 
wr.write(cleanText) 
wr.close() 

테스트의 목적은 모두 stopwords.txt로 사용하고

माब्लानिफ्रायथो
फारसेनिफ्रायबो
रावनिफ्रायबो
माब्लानिफ्राय
जेब्लानिफ्राय
을 corpus.txt를 들어 अब्लानि ्राय
इफोरनिफ्राय
नोंनिफ्रायबो
फारसेनिफ्राय
नोंनिफ्रायनो

는 경우 output.txt 파일은 빈 파일이어야하지만 다음이 포함

रावनिफ्रायबो
इफोरनिफ्राय

이 코드는 영어 텍스트 (ASCII)에서 잘 작동하므로 utf-8 처리에 문제가있을 수 있습니다. 제발 제안 해주세요.

+1

필자는 왜 실패했는지 알지 못합니다.하지만 테스트했을 때 출력물에 더 많은 항목이있었습니다. 누락 된 모든 불용어에는 결합 문자 (예 : थ, थ + ◌ो)가 포함되어 있습니다. 아마도 단어 경계 검출기'\ b'는 문자 결합과 함께 올바르게 작동하지 않습니다. – jogojapan

+0

@ jogojapan 나는 캐릭터를 결합하는 것이 문제라고 생각하지 않는다 : Ф + र = फ्र, न + م = नो 등등. – srajbr

+1

http://stackoverflow.com/questions/16579113/regular-expression-doesnt-work-properly-with-turkish-characters의 중복 – prash

답변

2

시작을 제공 또는 숫자로 정의되지 않는 문자로 끝나는 파일의 중지 단어의 일부를 :

import unicodedata as ud 
for w in stopWords: 
    for c in w[0], w[-1]: 
     print repr(c), ud.category(c), 
    print 
u'\u092e' Lo u'\u094b' Mc 
u'\u092b' Lo u'\u094b' Mc 
u'\ufeff' Cf u'\u094b' Mc 
u'\u092e' Lo u'\u092f' Lo 
u'\u091c' Lo u'\u092f' Lo 
u'\u0905' Lo u'\u092f' Lo 
u'\ufeff' Cf u'\u092f' Lo 
u'\u0928' Lo u'\u094b' Mc 
u'\u092b' Lo u'\u092f' Lo 
u'\u0928' Lo u'\u094b' Mc 

특히, 두 줄 - 당신이 출력에서보고있는 것. TXT - u'\ufeff' 시작 :

ud.name(u'\ufeff') == 'ZERO WIDTH NO-BREAK SPACE' 

이 또한 바이트 순서 표시 (BOM)라고하며 때로는 인코딩을 식별하기 위해 파일의 시작 부분에 사용됩니다. 여기서는 파일을 편집 할 때 실수로 파일에 포함 된 것 같습니다. Python은 문자가 파일의 맨 처음에있는 경우 문자를 제거하는 것처럼 보이지만 파일의 다른 곳에 나타나지 않는 문자는 제거하는 것처럼 보입니다. strip()은 분명히 그것을 제거하기에 충분하지 않습니다. 이러한 문자는 입력 파일에서 수동으로 제거해야합니다.

또한, 출력에 u'\u094b' (DEVANAGARI 모음 기호 O)로 끝나는 사람을 얻고 그래서 파이썬의 내 사본은 분명히이 같은 영숫자 문자를 취급하지 않습니다.

정규 표현식에서 정확한 문자열을 일치 시키려면 일반 문자열 메타 문자로 취급 될 문자가 포함되어있는 경우 일반 표현식에 삽입하기 전에 re.escape(string)을 사용해야합니다.