2016-09-09 19 views
-1

私は、さまざまなソースから膨大な数の名前を持っています。文章クラスタリング

  1. 私はすべてのグループ(名前の一部)を抽出する必要があります。 以下の例では、プログラムは、郵便局、郵便局、郵便局を探す必要があります。
  2. 私は人気のカウントを取得する必要があります。

だから、人気のあるフレーズのリストでソートしたいと思います。ここで

は、名前の例です。

Post Office - High Littleton 
Post Office Pilton Outreach Services 
Town Street Post Office 
post office St Thomas 

は基本的に、このような結果を得るために、いくつかのアルゴリズムまたはより良いライブラリを見つける必要があります。ここでは

Post Office: 16999 
Post: 17934 
Office: 16999 
Tesco: 7300 
... 

がいっぱいexample of namesです。

私は、単一の言葉のためではなく、文章の罰金であるコードを書いた:

from textblob import TextBlob 
import operator 

title_file = open("names.txt", 'r') 
blob = TextBlob(title_file.read()) 
list = sorted(blob.word_counts.items(), key=operator.itemgetter(1)) 
print list 
+0

「私はそれらの間に関連性を持ち、すべての結果を(名前から抽出された)文章でグループ化したいですか? – garg10may

+0

nグラムまたはクラスタごとに文の出現回数をカウントしますか?これらは2つの別々のものです。 –

+0

@SemihYagcioglu私はすべての名前の中で最も普及している文章を入手したい: 2つ以上の名前を含むグループのみ; グループにはテキストデータのみが含まれています。 複数の単語から文を含むことができます。 入力のみが必要です - 名前のリスト –

答えて

0

あなたはクラスタリングを探していません(と@andrewmatteのために、「それらのすべてが吸う」理由はおそらくです)。

あなたが探しているのはです。単語の数は(正確には、nグラムカウント)です。実際にははるかに簡単な問題です。それはあなたがそのライブラリを見つけることができない理由です...

まあ、実際にはいくつかのライブラリをjave。たとえば、Pythonの場合、collectionsモジュールには、再利用可能なコードの多くを持つクラスCounterがあります。

テストされていない、非常に基本的なコード:

from collections import Counter 
counter = Counter() 
for s in sentences: 
    words = s.split(" ") 
    for i in range(len(words)): 
    counter.add(words[i]) 
    if i > 0: counter.add((words[i-1], words[i])) 

あなたはcounterから最も頻繁に取得CSN。単語と単語のペアを区別したい場合は、2つのカウンターを自由に使用してください。長いフレーズが必要な場合は、内側のループを追加します。また、文章(小文字など)をきれいにし、分割するために正規表現を使用することもできます。

0

このようなものをお探しですか?

workspace={} 

with open('names.txt','r') as f: 
    for name in f: 
    if len(name): # makes sure line isnt empty 
     if name in workspace: 
     workspace[name]+=1 
     else: 
     workspace[name]=1 

for name in workspace: 
    print "{}: {}".format(name,workspace[name])