web-dev-qa-db-ja.com

製品文字列を照合するための最良の機械学習手法

ここにパズルがあります...

同じ50000以上の電子製品のデータベースが2つあり、一方のデータベースの製品ともう一方のデータベースの製品を一致させたい。ただし、製品名は常に同じであるとは限りません。文字列の類似性を測定するためにレーベンシュタイン距離を使用してみましたが、これはうまくいきませんでした。例えば、

-LG 42CS560 42-Inch 1080p 60Hz LCD HDTV
-LG 42 Inch 1080p LCD HDTV

これらのアイテムは同じですが、製品名はかなり異なります。

一方...

-LG 42 Inch 1080p LCD HDTV
-LG 50 Inch 1080p LCD HDTV

これらは非常によく似た製品名の異なる製品です。

この問題にどのように取り組むべきですか?

32
Nathan

私の最初の考えは、名前を解析して機能の説明(会社LG、サイズ42 Inch、 解決 1080p、タイプLCD HDTV)。次に、互換性のためにこれらの説明を互いに照合できます。製品番号を省略してもかまいませんが、サイズが異なると不良です。単純なare-the-common-attributes-compatibleで十分な場合があります。または、異なる属性がどれだけ異なることが許可されるかなどのルールを作成または学習する必要がある場合があります。

あなたが持っている製品の種類の数とリストされた名前の違いに応じて、私は実際に属性のセットを手動で定義し、おそらくそれらに一致する特定の単語/正規表現を追加して、解析されていないものを繰り返し確認することから始めるかもしれませんこれまでのところ、そのためのルールを追加しています。 1つの語彙アイテムが複数の属性に属している可能性があるという点では、あいまいさはそれほどないと思いますが、データベースを確認しないと、わかりません。

それが実現可能でない場合、この抽出は、半教師付き品詞タグ付けに類似しています。ただし、ボキャブラリーは通常の構文解析よりもはるかに制限されていると思います。また、製品名のスペースはより階層的です。resolutionタグは特定の種類の製品にのみ適用されます。私はその文献にはあまり詳しくありません。あなたが使用できるいくつかのアイデアがあるかもしれません。

17
Dougal

トレーニング例の大規模なセットを使用します。この例のセットで考えられる各ペアについて:

  1. コンポーネントの文字列を解析します。 company、size_desc、display_type、makeなど。
  2. ペアの2つの文字列間の同じコンポーネント間の距離を求めます。
  3. コンポーネント間の距離を表す数値のタプルを作成します。
  4. トレーニングセットの一部としてペアの文字列に基づいて、タプルに同一/非同一のラベルを付けます。
  5. タプルをフィードし、バイナリ分類子(SVM)をトレーニングします。

次に、同じかどうかを判断する文字列のペアを取得したら、トレーニングセットで行ったように特徴を抽出し、文字列のさまざまなコンポーネント間の距離の数値のタプルを作成します。タプルをトレーニング済みのSVMにフィードし、それらが同じかどうかを分類します。

このような学習アプローチを使用する利点は、ルールを何度も何度も変更する必要がないことです。また、システムは、同じ製品と異なる製品の大きなペアの違いを学習します。

これを行うには、WEKAのLibSVMパッケージを使用できます。

13
London guy

機械学習についてはあまり知りませんが、レーベンシュタイン距離がこの種の問題に最適なアプローチではないことは知っています。

私は現在、非常に類似した問題に取り組んでおり、最大連続サブシーケンス( https://www.geeksforgeeks.org/longest-consecutive-subsequence )を使用してはるかに正確な一致を見つけました。

また、Longest Common Substringも役立ちます( https://www.geeksforgeeks.org/longest-common-substring-dp-29/ )。

...またはおそらく両方の組み合わせです!

レーヴェンシュタインは、置換が可能で、余分な文字がある類似の文字列を簡単に割り引くことができるため、すばらしいものではありません。たとえば、「He​​llo AAAAAA」、「Hello」、「BBBBB」などです。

「こんにちは」と「BBBBB」は、「こんにちは」と「こんにちはAAAAAA」を一致させることを希望する場合でも、レーベンシュタイン距離が近いです。

LCSとLSSは置換を許可しないため、これらの方法の両方で、「Hello」は「Hello AAAAAA」と一致します。

0
c.abate