2016-07-07 19 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])] 

最後の行 "tokens"は単語の代わりに文字を返します。文のリストからトークンを作成すると、単語の代わりに文字が返されます

これはなぜですか。代わりに返信するにはどうすればよいですか?特に文のリストに基づいてそれを行うことを検討する。

+0

最初にデコードしてから小文字にします。そうしないと、ASCII以外の文字で正しくない動作をします。 – alexis

答えて

2

sent_tokenizeは文字列のリストとitertools.chainチェーンを返すので、1つのiterableに対してiterablesを実行して、それぞれが使い果たされるまで一度に1つずつアイテムを返すようにします。実際には、文を1つの文字列に再結合して、リストの理解度に反復します。

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

これは句読点を処理しませんが、あなたのオリジナルの試みはないかだろう:例えば、分割のためにすることができます文章のリストから単語の単一のリストを作成し、平坦にする

。あなたの元には、分割しても動作します:あなたは解凍するために、引数としてリスト内包の代わりにジェネレータ式を使用することができます

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

注意を。さらに良いことに、chain.from_iterableを使用します。

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

代わりstr.splitの句読点の取り扱い使用nltk.tokenize.word_tokenizeについて。単語と句読点は別々のアイテムとして返され、I'sI'sに分割されます(実際には別の単語になっているので契約は結構です)。

+0

'split()'ではなく 'nltk.word_tokenize()'を使います。句読点と言葉は異なるトークンです。 – alexis

1

の代わりに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見て、我々は、各行が1つまたは複数の文で構成されることがあります、段落のいくつかの並べ替えが含まれていると仮定した場合、我々は最初に全体を格納するためのリストを初期したいと思いますドキュメント:

document = [] 

その後、我々は、ラインを反復処理し、アップ文章に行を分割:

for line in fin: 
    sentences = sent_tokenize(line) 

はその後、我々はトンに文章を分割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)] 

(でも、1行で可能です):

[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'...']] 
関連する問題