14

分類子の機能として ngram カウントを使用する論文を読んだことがありますが、これが正確に何を意味するのか疑問に思っていました。

テキストの例: "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam"

このテキストからユニグラム、バイグラム、トリグラムなどを作成できますが、これらのユニグラムを作成する「レベル」を定義する必要があります。「レベル」は、文字、音節、単語などです。

では、上記の文からユニグラムを作成すると、単にすべての単語のリストが作成されるのでしょうか?

バイグラムを作成すると、単語のペアが互いに続く単語をまとめることになりますか?

論文が ngram カウントについて述べている場合、テキストからユニグラム、バイグラム、トライグラムなどを単純に作成し、どの ngram がどのくらいの頻度で発生するかをカウントします。

Pythonのnltkパッケージに既存のメソッドはありますか? または、独自のバージョンを実装する必要がありますか?

4

4 に答える 4

17

私は古いコードを見つけました、多分それは役に立つでしょう。

import nltk
from nltk import bigrams
from nltk import trigrams

text="""Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam ornare
tempor lacus, quis pellentesque diam tempus vitae. Morbi justo mauris,
congue sit amet imperdiet ipsum dolor sit amet, consectetur adipiscing elit. Nullam ornare
tempor lacus, quis pellentesque diam"""
# split the texts into tokens
tokens = nltk.word_tokenize(text)
tokens = [token.lower() for token in tokens if len(token) > 1] #same as unigrams
bi_tokens = bigrams(tokens)
tri_tokens = trigrams(tokens)

# print trigrams count

print [(item, tri_tokens.count(item)) for item in sorted(set(tri_tokens))]
>>> 
[(('adipiscing', 'elit.', 'nullam'), 2), (('amet', 'consectetur', 'adipiscing'), 2),(('amet', 'imperdiet', 'ipsum'), 1), (('congue', 'sit', 'amet'), 1), (('consectetur', 'adipiscing', 'elit.'), 2), (('diam', 'tempus', 'vitae.'), 1), (('dolor', 'sit', 'amet'), 2), (('elit.', 'nullam', 'ornare'), 2), (('imperdiet', 'ipsum', 'dolor'), 1), (('ipsum', 'dolor', 'sit'), 2), (('justo', 'mauris', 'congue'), 1), (('lacus', 'quis', 'pellentesque'), 2), (('lorem', 'ipsum', 'dolor'), 1), (('mauris', 'congue', 'sit'), 1), (('morbi', 'justo', 'mauris'), 1), (('nullam', 'ornare', 'tempor'), 2), (('ornare', 'tempor', 'lacus'), 2), (('pellentesque', 'diam', 'tempus'), 1), (('quis', 'pellentesque', 'diam'), 2), (('sit', 'amet', 'consectetur'), 2), (('sit', 'amet', 'imperdiet'), 1), (('tempor', 'lacus', 'quis'), 2), (('tempus', 'vitae.', 'morbi'), 1), (('vitae.', 'morbi', 'justo'), 1)]
于 2012-10-10T14:07:49.553 に答える
3

n-gram をカウントするときは、count を使用するよりも、ハッシュ テーブル (辞書) を使用する方が適切です。上記の例の場合:

unigrams = {}
for token in tokens:
  if token not in unigrams:
    unigrams[token] = 1
  else:
    unigrams[token] += 1

これにより、時間の複雑さがO(n)になります

于 2016-09-30T00:44:41.250 に答える
1

NLTK にはコロケーションという概念があります。

役に立つかもしれません。

于 2013-09-06T06:34:28.493 に答える
-1

これを支援するための特定の方法が nltk にあるとは思いません。これは難しいことではありません。n 単語の文がある場合 (単語レベルを使用していると仮定)、長さ 1-n のすべての ngram を取得し、それらの ngram のそれぞれを繰り返し処理し、それらを連想配列のキーにします。値はカウントです。コードは 30 行を超えてはなりません。このための独自のパッケージを作成し、必要な場所にインポートすることができます。

于 2012-10-10T14:06:59.093 に答える