33

Python のNLTKには、テキスト内の単語の頻度を示す関数FreqDistがあります。テキストを引数として渡そうとしていますが、結果は次の形式です。

[' ', 'e', 'a', 'o', 'n', 'i', 't', 'r', 's', 'l', 'd', 'h', 'c', 'y', 'b', 'u', 'g', '\n', 'm', 'p', 'w', 'f', ',', 'v', '.', "'", 'k', 'B', '"', 'M', 'H', '9', 'C', '-', 'N', 'S', '1', 'A', 'G', 'P', 'T', 'W', '[', ']', '(', ')', '0', '7', 'E', 'J', 'O', 'R', 'j', 'x']

一方、NLTK Web サイトの例では、結果は単なる文字ではなく単語全体でした。私はこのようにしています:

file_y = open(fileurl)
p = file_y.read()
fdist = FreqDist(p)
vocab = fdist.keys()
vocab[:100]

私が間違っていることを知っていますか?ありがとう!

4

6 に答える 6

46

FreqDistトークンの反復可能を期待します。文字列は反復可能です---反復子はすべての文字を生成します。

最初にテキストをトークナイザーに渡し、トークンをに渡しFreqDistます。

于 2011-01-08T16:44:40.063 に答える
32

FreqDist はトークンの配列で実行されます。最初に入力をトークン化する必要がある文字の配列 (文字列) を送信しています。

words = nltk.tokenize.word_tokenize(p)
fdist = FreqDist(words)
于 2011-06-27T23:58:28.967 に答える
22

NLTKFreqDistはあらゆるイテラブルを受け入れます。文字列は文字ごとに繰り返されるため、あなたが経験している方法で物事を引き離しています。

単語を数えるには、単語をフィードする必要がありFreqDistます。どうやってそれをしますか?ファイル全体をnltk.tokenize.word_tokenize.

>>> # first, let's import the dependencies
>>> import nltk
>>> from nltk.probability import FreqDist

>>> # wrong :(
>>> words = nltk.tokenize.word_tokenize(p)
>>> fdist = FreqDist(words)

word_tokenize文から単語モデルを構築します。各文を一度に 1 つずつフィードする必要があります。段落全体やドキュメントが与えられた場合、それは比較的貧弱な仕事をします。

じゃあ何をすればいいの?簡単に、文のトークナイザーを追加してください!

>>> fdist = FreqDist()
>>> for sentence in nltk.tokenize.sent_tokenize(p):
...     for word in nltk.tokenize.word_tokenize(sentence):
>>>         fdist[word] += 1

心に留めておくべきことの 1 つは、テキストをトークン化する方法がたくさんあるということです。モジュールはnltk.tokenize.sent_tokenizenltk.tokenize.word_tokenize比較的きれいな英語のテキストに対して合理的なデフォルトを選択するだけです。選択できるオプションは他にもいくつかあります。詳細については、API ドキュメントを参照してください。

于 2011-01-08T19:52:49.963 に答える
1
Your_string = "here is my string"
tokens = Your_string.split()

このようにしてから、NLTK関数を使用します。

トークンは文字ではなく単語で表示されます

于 2020-02-29T09:33:31.623 に答える
0
text_dist = nltk.FreqDist(word for word in list(text) if word.isalpha())
top1_text1 = text_dist.max()
maxfreq = top1_text1
于 2020-10-03T16:06:01.480 に答える