142

NLTK を使い始めたばかりで、テキストから単語のリストを取得する方法がよくわかりません。を使用するnltk.word_tokenize()と、単語と句読点のリストが得られます。代わりに言葉だけが必要です。どうすれば句読点を取り除くことができますか? またword_tokenize、複数の文では機能しません。最後の単語にドットが追加されます。

4

11 に答える 11

192

nltkが提供する他のトークン化オプションをここで見てください。たとえば、英数字のシーケンスをトークンとして選択し、その他すべてを削除するトークナイザーを定義できます。

from nltk.tokenize import RegexpTokenizer

tokenizer = RegexpTokenizer(r'\w+')
tokenizer.tokenize('Eighty-seven miles to go, yet.  Onward!')

出力:

['Eighty', 'seven', 'miles', 'to', 'go', 'yet', 'Onward']
于 2013-03-21T18:19:48.677 に答える
18

コメントで気づいたように、word_tokenize() は単一の文でしか機能しないため、sent_tokenize() で始まります。filter() で句読点を除外できます。また、Unicode 文字列がある場合は、それが Unicode オブジェクトであることを確認してください (「utf-8」などのエンコーディングでエンコードされた「str」ではありません)。

from nltk.tokenize import word_tokenize, sent_tokenize

text = '''It is a blue, small, and extraordinary ball. Like no other'''
tokens = [word for sent in sent_tokenize(text) for word in word_tokenize(sent)]
print filter(lambda word: word not in ',-', tokens)
于 2013-03-21T17:19:21.353 に答える
6

ある種の正規表現マッチングが必要だと思います (次のコードは Python 3 のものです)。

import string
import re
import nltk

s = "I can't do this now, because I'm so tired.  Please give me some time."
l = nltk.word_tokenize(s)
ll = [x for x in l if not re.fullmatch('[' + string.punctuation + ']+', x)]
print(l)
print(ll)

出力:

['I', 'ca', "n't", 'do', 'this', 'now', ',', 'because', 'I', "'m", 'so', 'tired', '.', 'Please', 'give', 'me', 'some', 'time', '.']
['I', 'ca', "n't", 'do', 'this', 'now', 'because', 'I', "'m", 'so', 'tired', 'Please', 'give', 'me', 'some', 'time']

などの正規表現トークナイザーから取得できない「n't」などのトークンを保持しながら句読点を削除するため、ほとんどの場合うまく機能するはずwordpunct_tokenizeです。

于 2016-08-03T05:11:47.640 に答える
2

@rmalouf によるソリューションに追加するだけで、\w+ は [a-zA-Z0-9_] と同等であるため、数字は含まれません。

from nltk.tokenize import RegexpTokenizer
tokenizer = RegexpTokenizer(r'[a-zA-Z]')
tokenizer.tokenize('Eighty-seven miles to go, yet.  Onward!')
于 2019-08-08T19:34:02.957 に答える