MySQLデータベースからの生のHTMLの一連のテキストアイテムがあります。これらのエントリで最も一般的なフレーズを見つけたい(単一の最も一般的なフレーズではなく、理想的には、単語ごとの一致を強制しない)。
私の例は、Yelp.comのレビューで、特定のレストランの何百ものレビューから3つのスニペットを次の形式で表示しています。
「ハンバーガーをお試しください」(44件のレビュー)
例:このページの「レビューのハイライト」セクション:
http://www.Yelp.com/biz/sushi-gen-los-angeles/
NLTKをインストールし、少し試してみましたが、正直、オプションに圧倒されます。これはかなり一般的な問題のようで、ここで検索して簡単な解決策を見つけることはできませんでした。
最も一般的なフレーズだけでなく、最も興味深い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)
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的ではないでしょうが、助けになるかもしれません!
まず、最初にすべてのHTMLタグを削除する必要があります( "<[^>] *>"を検索し、 ""に置き換えます)。その後、2つのテキスト項目ごとに最長の共通部分文字列を探すという素朴なアプローチを試すことができますが、非常に良い結果が得られるとは思いません。最初に単語を正規化(基本形式に減らし、すべてのアクセントを削除し、すべてを小文字または大文字に設定)してからthen分析することで、より良い結果を得ることができます。繰り返しますが、達成したい内容に応じて、Wordの順序に柔軟性を持たせれば、テキストアイテムをより適切にクラスター化できます。つまり、テキストアイテムを正規化された単語のバッグとして扱い、バッグコンテンツの類似性を測定します。
同様のトピック(同一ではありませんが)についてコメントしました here 。