51

いくつかの重み計算、出現率、またはその他のツールを使用して、特定のテキストからキーワード/タグを生成するアルゴリズム/方法が存在するかどうかに興味があります。

さらに、Python ベースのソリューション / ライブラリを指摘していただければ幸いです。

ありがとう

4

5 に答える 5

59

これを行う 1 つの方法は、文書内で偶然に予想されるよりも頻繁に出現する単語を抽出することです。たとえば、より大きなドキュメントのコレクションで、「マルコフ」という用語はほとんど見られないとします。ただし、同じコレクションの特定のドキュメントでは、マルコフが非常に頻繁に表示されます。これは、マルコフがドキュメントに関連付けるのに適したキーワードまたはタグである可能性があることを示唆しています。

このようなキーワードを識別するには、キーワードとドキュメントの点ごとの相互情報を使用できます。これは によって与えられPMI(term, doc) = log [ P(term, doc) / (P(term)*P(doc)) ]ます。これにより、特定のドキュメントでその用語に出くわした場合に、より大きなコレクションで出くわした場合と比べて、その用語に出くわしたときの驚きがどれほど少ないか (または多いか) がわかります。

ドキュメントに関連付けるのに最適な 5 つのキーワードを特定するには、ドキュメントの PMI スコアで用語を並べ替え、スコアが最も高い 5 つを選択します。

複数単語のタグを抽出したい場合は、一連のテキスト エントリから共通/重要なフレーズを抽出する方法に関する StackOverflow の質問を参照してください。

その質問に対する私の回答を借りて、NLTK コロケーションのハウツーでは、約 7 行のコードで n-gram PMI を使用して興味深いマルチワード表現を抽出する方法について説明しています。

import nltk
from nltk.collocations import *
bigram_measures = nltk.collocations.BigramAssocMeasures()

# change this to read in your data
finder = BigramCollocationFinder.from_words(
   nltk.corpus.genesis.words('english-web.txt'))

# only bigrams that appear 3+ times
finder.apply_freq_filter(3) 

# return the 5 n-grams with the highest PMI
finder.nbest(bigram_measures.pmi, 5)  
于 2010-04-18T22:57:28.990 に答える
10

まず、計算言語学の主要なPythonライブラリはNLTK(「NaturalLanguageToolkit」)です。これは、プロの計算言語学者によって作成および保守されている、安定した成熟したライブラリです。チュートリアルやFAQなどの豊富なコレクションもあります。私はそれを強くお勧めします。

以下は、質問で提起された問題のPythonコードでの簡単なテンプレートです。それは実行されるテンプレートですが、テキストを文字列として提供すると(私が行ったように)、単語の頻度のリストと、「重要性」(またはキーワードとしての適合性)の順にそれらの単語のランク付けされたリストが返されます)非常に単純なヒューリスティックによると。

特定のドキュメントのキーワードは、(明らかに)ドキュメント内の重要な単語(つまり、別のドキュメントと区別される可能性が高い単語)の中から選択されます。テキストの主題について先験的な知識がない場合、一般的な手法は、特定の単語/用語の重要度または重みをその頻度、または重要度=1/頻度から推測することです。

text = """ The intensity of the feeling makes up for the disproportion of the objects.  Things are equal to the imagination, which have the power of affecting the mind with an equal degree of terror, admiration, delight, or love.  When Lear calls upon the heavens to avenge his cause, "for they are old like him," there is nothing extravagant or impious in this sublime identification of his age with theirs; for there is no other image which could do justice to the agonising sense of his wrongs and his despair! """

BAD_CHARS = ".!?,\'\""

# transform text into a list words--removing punctuation and filtering small words
words = [ word.strip(BAD_CHARS) for word in text.strip().split() if len(word) > 4 ]

word_freq = {}

# generate a 'word histogram' for the text--ie, a list of the frequencies of each word
for word in words :
  word_freq[word] = word_freq.get(word, 0) + 1

# sort the word list by frequency 
# (just a DSU sort, there's a python built-in for this, but i can't remember it)
tx = [ (v, k) for (k, v) in word_freq.items()]
tx.sort(reverse=True)
word_freq_sorted = [ (k, v) for (v, k) in tx ]

# eg, what are the most common words in that text?
print(word_freq_sorted)
# returns: [('which', 4), ('other', 4), ('like', 4), ('what', 3), ('upon', 3)]
# obviously using a text larger than 50 or so words will give you more meaningful results

term_importance = lambda word : 1.0/word_freq[word]

# select document keywords from the words at/near the top of this list:
map(term_importance, word_freq.keys())
于 2010-04-18T18:19:09.470 に答える
5

http://en.wikipedia.org/wiki/Latent_Dirichlet_allocationは、トレーニング コーパス内の各ドキュメントをトピックの混合物として表現しようとします。トピックの混合物は、単語を確率にマッピングする分布です。

私は一度、製品レビューのコーパスを、「顧客サービス」、「製品の使いやすさ」など、すべてのドキュメントで語られている潜在的なアイデアに分析するために使用しました。基本モデルは、変換する方法を提唱していません。トピックは、トピックが何であるかを説明する単一の単語にモデル化されます..しかし、モデルがトレーニングされると、人々はそれを行うためにあらゆる種類のヒューリスティックを考え出しました。

http://mallet.cs.umass.edu/を試してみて、このモデルがニーズに合っているかどうかを確認する ことをお勧めします..

LDA は完全に監視されていないアルゴリズムであるため、手で注釈を付ける必要はありません。これは素晴らしいことですが、逆に言えば、期待していたトピックが得られない可能性があります。

于 2010-04-18T22:31:56.433 に答える
2

この問題の非常に簡単な解決策は次のとおりです。

  • テキスト内の各単語の出現回数を数えます
  • 最も頻繁に使用される用語をキー フレーズと見なす
  • 「ストップワード」のブラックリストを用意して、the、and、it、is などの一般的な単語を削除します

ただし、より賢い統計ベースのソリューションがあると確信しています。

関心のためではなく、より大きなプロジェクトで使用するソリューションが必要な場合は、Yahoo BOSS にキーワード抽出メソッドがあります。

于 2010-04-18T09:44:57.027 に答える