2016-07-07 63 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返回一個字符串句子列表和itertools.chain鏈迭代到單個迭代項,每次從一個迭代項中返回一個項,直到它們耗盡。實際上,您已將句子重新組合爲單個字符串,並在列表理解中對其進行迭代。

從句子的列表創建字的一個列表,你可以例如分裂和扁平:

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)] 

標點處理使用nltk.tokenize.word_tokenize代替str.split。它會將單詞和標點符號作爲單獨項目返回,並將例如I's分割爲I's(這當然是件好事,因爲它們實際上是單獨的詞,只是合約)。

+0

使用'nltk.word_tokenize()',而不是'split()'。標點符號和文字是不同的標記。 – alexis

1

首先,如果該文件是在 'UTF8',你正在使用Python2,它會更好,如果你使用encoding='utf8'參數io.open()

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 EA看看http://nedbatchelder.com/text/unipain.html


至於標記化,如果我們假設每行包含着一些段落可能會由一個或多個句子的,我們想先初始列表存儲整個文檔:

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)] 

不推薦!(但仍然可以在一行中):

[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'...']] 
相關問題