0

100 万をはるかに超える文字列を含むデータベース テーブルがあります。各文字列は、長さが 2 語から 5 語または 6 語までさまざまな用語です。

["big giant cars", "zebra videos", "hotels in rio de janeiro".......]

また、csv ファイルには、数千を超える小さな用語のブラックリストがあります。私がやりたいことは、データベース内の類似した用語を csv ファイル内のブラックリストに登録された用語と識別することです。この場合の類似性は、ブラックリストに登録された用語のスペルミスと解釈できます。

私は、レーベンシュタイン距離を使用して文字列の類似性を評価し、類似性の整数表現を返すことができるfuzzywuzzyなどの Python のライブラリに精通しています。このチュートリアルの例は次のとおりです。

fuzz.ratio("NEW YORK METS", "NEW YORK MEATS") ⇒ 96

このアプローチの欠点は、別の文脈で何かを意味する用語を誤って識別する可能性があることです。

この単純な例は、ブラックリストに登録された文字列「big butt」で、「big but」のような無害な文字列と混同されます。

私の質問は、python でこれを達成することはプログラム的に可能ですか、それとも似たようなキーワードをすべて取得して誤検出をフィルタリングする方が簡単でしょうか?

4

1 に答える 1

2

この問題に対する決定的な答えがあるかどうかわからないので、私にできる最善の方法は、この問題にどのようにアプローチするかを説明することです. :-)

初め。

関係のない角度から見ると、ファジー文字列マッチングでは不十分な場合があります。人々は似たような文字や非文字記号を使用してテキストの一致を回避し、ブラックリストに載っている単語と実際のテキストの一致がほぼゼロになるまで、それが何であるかはまだ判読可能です. したがって、すべての「0」(ゼロ) を「O」(大文字の O) に変換したり、「><」を「X」に変換したりするなど、辞書と検索テキストの正規化が必要になる場合があります。ライブラリおよび/またはその目的への変換参照。非ラテン記号も明確な可能性があり、考慮する必要があります。

2番。

ブラックリストに載っている単語と、見た目が似ている法的なバリエーションを 1 回のパスで区別できるとは思えません。そうです、ほとんどの場合、ブラックリストに登録されている可能性のある一致を検索し、見つかったものがいくつかの合法的な単語と一致するかどうかを確認する必要があります. つまり、ブラックリストに登録された辞書だけでなく、ホワイトリストに登録された辞書も必要になります。よりポジティブな点として、ホワイトリストに登録された辞書を正規化する必要はおそらくありません。受け入れられるテキストを書いている人は、上で概説したトリックなしで受け入れられる言語でそれを書く可能性が高いからです。または、偏執症を感じている場合は、正常化することもできます。:-)

三番。

ただし、問題は、ブラックリストとホワイトリストに対して単語/表現を照合しても、実際には信頼できる答えが得られないことです. あなたの例を使用すると、コンテキストで明らかな正直なタイプミスとして「big butt」を書く可能性があります(またはその逆に、ホワイトリストに登録された単語に対してより高い一致を得るために意図的に「big but」を書きます。コンテキストが完全であっても)本当の意味は明らかです)。そのため、ブラック リストとホワイト リストの両方に対して十分な一致がある場合は、実際にコンテキストを確認する必要があります。あまり詳しくない分野です。(両方の辞書から) さまざまな単語の相関マップを作成して、それらと組み合わせて使用​​される頻度が高い (または少ない) 単語を特定し、それらを使用して特定の例を確認することはおそらく可能です。この段落を例として使用すると、

第4。

これらすべての対策を一緒に適用しても、ある程度の灰色の領域を残したい場合があります。つまり、いずれかの方向性が十分に確実でない限り、最終的な決定は人間に任せてください (しばらくの間、コメントや投稿を選別し、それらを自動的にモデレーション キューに入れるなど、プロジェクトが指示するものは何でも)。

5番目。

アルゴリズムの学習に手を出し、前のステップから人間の入力を収集し、それを使用して時間の経過とともにアルゴリズムを自動的に微調整しようとするかもしれません。

それが役立つことを願っています。:-)

于 2016-03-03T15:15:38.040 に答える