2016-07-07 1 views
-1
from nltk.tokenize import sent_tokenize 

text = open(path).read().lower().decode("utf8") 
sent_tokenize_list = sent_tokenize(text) 

tokens = [w for w in itertools.chain(*[sent for sent in sent_tokenize_list])] 

마지막 줄 "토큰"은 단어 대신 문자를 반환합니다.문장 목록에서 토큰을 만들 때 단어 대신 문자가 반환됩니다.

왜 그런가요? 대신 단어를 반환하도록하려면 어떻게해야합니까? 특히 문장의 목록에 따라 그것을하는 것을 고려하십시오.

+0

첫 번째 디코딩 후 소문자. 그렇지 않으면 비 ASCII 문자로 잘못된 동작이 발생합니다. – alexis

답변

2

sent_tokenize은 문자열 문장 목록을 반환하고 하나씩 반복 가능한 iterables를 반복적으로 사용하여 항목이 모두 소모 될 때까지 한 번에 하나씩 반환합니다. 결과적으로 문장을 하나의 문자열로 재결합하고 목록 이해에서 반복합니다. 이 문장을 처리하지 않습니다

tokens = [word for sent in sent_tokenize_list for word in sent.split()] 

하지만, 원래의 시도 중 하나없는 것 :

는 예를 분할하고 평평하게 할 수 있습니다에 대한 문장 목록에서 단어의 단일 목록을 만들려면. 원본도 분할로 작동합니다.

압축 해제 인수로 목록 이해 대신 발전기 표현식을 사용할 수 있습니다. 더 좋은 chain.from_iterable를 사용

tokens = [w for w in itertools.chain.from_iterable(
    sent.split() for sent in sent_tokenize_list)] 

을 구두점 처리 사용 nltk.tokenize.word_tokenize 대신 str.split하십시오. 단어와 구두점을 별도의 항목으로 반환하고 I'sI's으로 분할합니다. 실제로는 별개의 단어이므로 방금 계약 했으므로 좋은 방법입니다.

+0

'split()'이 아니라'nltk.word_tokenize()'를 사용하십시오. 구두점과 단어는 서로 다른 토큰입니다. – alexis

1

sent_tokenize 대신 word_tokenize을 사용해야 할 수도 있습니까?

from nltk.tokenize import work_tokenize 

text = open(path).read().lower().decode("utf8") 
tokens = word_tokenize(text) 

첫째 http://www.nltk.org/api/nltk.tokenize.html#nltk.tokenize.word_tokenize

+0

문장 경계에 관계없이 모든 토큰 목록을 원하는 경우이 방법이 가장 좋습니다. – alexis

1

, 파일이 'UTF8'에 당신이 Python2를 사용하는 경우 io.open()encoding='utf8' 매개 변수를 사용하는 경우, 그것은 더 나은 수 있습니다 :

import io 

from nltk import word_tokenize, sent_tokenize 

with io.open('file.txt', 'r', encoding='utf8') as fin: 
    document = [] 
    for line in fin: 
     tokens += [word_tokenize(sent) for sent in sent_tokenize(line)] 

Python3이라면 다음과 같이하면됩니다 :

from nltk import word_tokenize 

with open('file.txt', 'r') as fin: 
    document = [] 
    for line in fin: 
     tokens += [word_tokenize(sent) for sent in sent_tokenize(line)] 

Do tak http://nedbatchelder.com/text/unipain.html 토큰 화에 관해서는


에서 EA의 모습, 우리가 가정하면 각 라인은 하나 이상의 문장으로 구성 될 수 단락의 일종을 포함, 우리는 먼저 전체를 저장하는 목록을 초기 싶습니다 문서 :

for line in fin: 
    sentences = sent_tokenize(line) 

그런 다음 우리는 t들로 문장을 분할 :

document = [] 

그런 다음 우리는 라인을 통해 반복하고 문장들로 라인을 분할 okens : 우리가 토큰 화 된 문장을 저장하기 위해 문서 목록을 업데이트 할 때문에

token = [word_tokenize(sent) for sent in sent_tokenize(line)] 

, 우리는 사용

document = [] 
for line in fin: 
    tokens += [word_tokenize(sent) for sent in sent_tokenize(line)] 

은 권장하지 않음! (한 줄에서 계속 가능) :

[email protected]:~$ cat file.txt 
this is a paragph. with many sentences. 
yes, hahaah.. wahahha... 
[email protected]:~$ python 
Python 2.7.11+ (default, Apr 17 2016, 14:00:29) 
[GCC 5.3.1 20160413] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import io 
>>> from itertools import chain 
>>> from nltk import sent_tokenize, word_tokenize 
>>> list(chain(*[[word_tokenize(sent) for sent in sent_tokenize(line)] for line in io.open('file.txt', 'r', encoding='utf8')])) 
[[u'this', u'is', u'a', u'paragph', u'.'], [u'with', u'many', u'sentences', u'.'], [u'yes', u',', u'hahaah..', u'wahahha', u'...']] 
관련 문제