web-dev-qa-db-ja.com

テキストコンテンツからのタグの生成

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

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

ありがとう

45
Hellnar

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

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

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

マルチワードタグを抽出する場合は、StackOverflowの質問 一連のテキストエントリから一般的な/重要なフレーズを抽出する方法 を参照してください。

NLTK collocations how-to は、その質問に対する私の回答を借用して、約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)  
58
dmcer

まず、キーpythonライブラリは [〜#〜] nltk [〜#〜] ( "自然言語ですToolkit ")。これは、専門の計算言語学者によって作成および保守された安定した成熟したライブラリです。また、広範な collection のチュートリアル、FAQなどがあります。それは非常に。

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

特定のドキュメントのキーワードは、ドキュメント内の重要な単語(他のドキュメントと区別される可能性が高い単語)から(明らかに)選択されます。テキストの主題に関するpriori知識がない場合、一般的な手法は、特定の単語/用語の重要度または重要度をその頻度から推定するか、または重要度= 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())
10
doug

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

私は一度、製品レビューのコーパスを、「カスタマーサービス」、「製品の使いやすさ」など、すべてのドキュメントにわたって話されている潜在的なアイデアに分析するために使用しました。基本モデルは、変換する方法を推奨していませんトピックは、トピックが何であるかを説明する1つのWordにモデル化されます。

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

LDAは完全に監視なしのアルゴリズムであるため、手作業で注釈を付ける必要はありませんが、反対に、期待したトピックが提供されない可能性があります。

4
Aditya Mukherji

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

  • テキスト内の各単語の出現を数える
  • 最も頻繁な用語をキーフレーズと見なす
  • 「ストップワード」のブラックリストを作成して、次のような一般的な単語を削除します。

統計ベースの賢い解決策は確かにあると思います。

利益のためではなく、より大きなプロジェクトで使用するソリューションが必要な場合、Yahoo BOSSには重要な用語抽出方法があります。

0
Adam Pope