web-dev-qa-db-ja.com

NLTKを使用したFreqDist

[〜#〜] nltk [〜#〜]in pythonは関数 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]

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

24
afg102

FreqDistは、反復可能なトークンを想定しています。文字列は反復可能です---反復子はすべての文字を生成します。

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

40
Alex Brasetvik

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

words = nltk.tokenize.Word_tokenize(p)
fdist = FreqDist(words)
25
Eran Kampf

NLTKのFreqDistは、反復可能なものを受け入れます。文字列は文字ごとに繰り返されるため、あなたが経験している方法で物事を引き離します。

単語を数えるには、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文からWordモデルを構築します。各文を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_tokenizeおよびnltk.tokenize.Word_tokenizeは、比較的きれいな英語のテキストに適切なデフォルトを選択するだけです。選択できる他のオプションがいくつかあります。これらは APIドキュメント で読むことができます。

14
Tim McNamara

次のように使用するだけです。

import nltk
from nltk.probability import FreqDist

sentence='''This is my sentence'''
tokens = nltk.tokenize.Word_tokenize(sentence)
fdist=FreqDist(tokens)

変数fdistのタイプは「class 'nltk.probability.FreqDist」であり、単語の頻度分布が含まれています。

6
Aakash Anuj