2016-11-20 10 views
1

ブランド名(Coca-Cola、Pepsi、7Upなど)が含まれているテキストのリストがあります。私は同じコンテンツ(同じテキスト、小文字の全テキストの後ろ)を持つすべてのセルをソートしてカウントし、各テキストの数によってリストを並べ替えるPythonスクリプトを書いたので、最も出現するテキストが最初に表示され、なぜなら、ほとんどの人がブランド名を正しく書いてくれると私は考えているからです。たとえば 私は次のリストを持っている場合:ブランド名と一致するように文字列を比較し、スペルミスを削除します

texts = ['Coca-Cola', 'Pepsi', 'Coca-Cola', 'Coca-Cola', 'Pepsi', 'Pespi', 'Pepsi', '7Up', '7up', 'Cola', 'Pepsi'] 

最初のステップの後のリストは次のようになります。

ordered_text = [ 
    {'text': 'Pepsi', count: 4}, 
    {'text': 'Coca-Cola', count: 3}, 
    {'text': '7Up', count: 2}, 
    {'text': 'Cola', count: 1}, 
    {'text': 'Pespi', count: 1}, 
] 

第二段階では、私がしようと近づくと一致するようにngramパッケージを使用していますスペルミスを修正するためのテキスト。 重要な注記:私の主な要求の1つは、言語に不可知の解決策を用意することです。

私の問題は、長いテキストではうまく動作しますが、短いテキストではうまくいきません。たとえば、実行している場合:

ngram.NGram.compare('Pepsi', 'Pespi') 

は、結果は次のようになります。非常に低い「スコア」をですが、あなたが見ることができるように、文字列が本当に近く、唯一の1文字がある

0.2727272727272727 

こと配置が間違っています。

Relustを改善するにはどうすればよいですか?私は別のアルゴリズムを使用する必要がありますか?あるいは、このテストに異なるパラメータを指定することはできますか?私が見つけたすべての「新しい」単語を含む辞書を追加して追加した後、それぞれの単語をそれと比較することができますが、スクリプトの細かさは失われます。

+1

タイプミスの場合、[levenshtein distance](https://en.wikipedia.org/wiki/Levenshtein_distance)は機能しますか? – Aufziehvogel

+0

おそらく「低=良い」ですか?とにかく、私は個人的にはスペルチェックにLevenshtein距離を使うのが好きです。例えば、「ミスプレイド」対「ミスプレイス」のLDは「2」である。単語の長さで割ると、2/9になります。これはかなり近いです。 – usr2564301

+0

'NGRAM'では、スコアを1に近づけたいと思っています。つまり、文字列は同じです。 私は一般的に、NGRAMアルゴリズムを実行し、levenshtein距離を試して実行するのに一致するものが見つからなかった場合、またはこの場合にlevenshtein距離を使用するのが最善であると思いますか? –

答えて

1

入力の正確性をスペルチェックしたい場合や、グループ化したい場合は、あなたの質問からは分かりません。たとえば、入力が['coka-cola', 'coak-cola', 'coca-coca']のように見える場合、アルゴリズムはどのようにする必要がありますか?

  • これらをすべて{'coka-cola': 3}としてグループ化する必要がありますか?意味は常に最初の発生と入力を比較しますか?この場合、編集距離が意味をなさないので、これに対して多くのPython実装を簡単に見つけることができます。

  • 正しいスペルでグルーピングする必要がありますか?{'coka-cola': 3}?この場合、あなたは良いスペルコレクターが必要です。ここにはいくつかのオプションがありますが、autocorrectパッケージ、またはより複雑なソリューションの場合はNLTKパッケージをご覧ください。もう1つの選択肢は、Googleを使用することです。私はGoogleからサポートされているAPIはないと思うので、スペルを修正する必要があります。そのため、Googleにリクエストを発行する際に推奨される結果を得るために何らかの手間をかけなければなりません。

+0

アルゴリズムの最終結果は、類似してグループ化されたすべてのテキストでなければなりません: '[{'coka-cola':2}、{'' coca-coca ':1}]'文字列は似ており、3番目の文字列はあまり似ていません。それは理にかなっていますか? –

+0

なぜ「コカ・コーラ」と「コカ・コーラ」が「コカ・コカ」よりもお互いに最も似ていると思うのは明らかではありません。たとえば、編集距離を使用すると、編集距離が非常に短いので、編集距離はすべて互いに2回の編集となります。 – yelsayed

関連する問題