web-dev-qa-db-ja.com

一連のテキストエントリから一般的/重要なフレーズを抽出する方法

MySQLデータベースからの生のHTMLの一連のテキストアイテムがあります。これらのエントリで最も一般的なフレーズを見つけたい(単一の最も一般的なフレーズではなく、理想的には、単語ごとの一致を強制しない)。

私の例は、Yelp.comのレビューで、特定のレストランの何百ものレビューから3つのスニペットを次の形式で表示しています。

「ハンバーガーをお試しください」(44件のレビュー)

例:このページの「レビューのハイライト」セクション:

http://www.Yelp.com/biz/sushi-gen-los-angeles/

NLTKをインストールし、少し試してみましたが、正直、オプションに圧倒されます。これはかなり一般的な問題のようで、ここで検索して簡単な解決策を見つけることはできませんでした。

61
arronsky

最も一般的なフレーズだけでなく、最も興味深いcollocationsが必要だと思います。そうしないと、一般的な単語で構成されたフレーズが過剰に表示され、興味深く有益なフレーズが少なくなる可能性があります。

これを行うには、基本的にデータからn-gramを抽出してから、最も高い 点に関する相互情報 (PMI)を持つものを見つけます。つまり、偶然に予想されるよりもはるかに多くの単語が一緒に共起することを見つけたいということです。

NLTK collocations how-to は、約7行のコードでこれを行う方法をカバーしています。例:

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

# 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 10 n-grams with the highest PMI
Finder.nbest(bigram_measures.pmi, 10)
86
dmcer

あなたが探しているのはチャンクだと思います。 NLTK本の第7章 を読むこと、または チャンク抽出 に関する自分の記事を読むことをお勧めします。これらは両方とも、品詞タグ付けの知識を前提としています。これについては、 chapter 5 で説明しています。

4
Jacob

3 ngramを超えたい場合は、これを試してください。私はあなたがhtmlなどのようにすべてのジャンクを除去したと仮定しています.

import nltk
ngramlist=[]
raw=<yourtextfile here>

x=1
ngramlimit=6
tokens=nltk.Word_tokenize(raw)

while x <= ngramlimit:
  ngramlist.extend(nltk.ngrams(tokens, x))
  x+=1

たぶん私はこれを一ヶ月かそこらだけやっているのであまりPython的ではないでしょうが、助けになるかもしれません!

3
Toby

まず、最初にすべてのHTMLタグを削除する必要があります( "<[^>] *>"を検索し、 ""に置き換えます)。その後、2つのテキスト項目ごとに最長の共通部分文字列を探すという素朴なアプローチを試すことができますが、非常に良い結果が得られるとは思いません。最初に単語を正規化(基本形式に減らし、すべてのアクセントを削除し、すべてを小文字または大文字に設定)してからthen分析することで、より良い結果を得ることができます。繰り返しますが、達成したい内容に応じて、Wordの順序に柔軟性を持たせれば、テキストアイテムをより適切にクラスター化できます。つまり、テキストアイテムを正規化された単語のバッグとして扱い、バッグコンテンツの類似性を測定します。

同様のトピック(同一ではありませんが)についてコメントしました here