1

私は次の問題を抱えています:

類似点を探しています。したがって、200000エントリの大きなソーステーブルと10000エントリの2番目のテーブルがあります。ここで、各テーブルのエントリセットを取得し、ソーステーブルのすべての行をJavaの2番目のテーブルのすべての行と比較しています(NeedleMan Gotohアルゴリズムと同様のより複雑なアルゴリズムを使用しています)。それは10億の比較を意味し、それは多すぎて遅すぎます...

目標は、すべての類似性(ソーステーブルからのID、2番目のテーブルからのID、および類似性の値)、または少なくともすべてのエントリのベストマッチ(またはベストxマッチ)のようなテーブルです。

「通常の」時間にそのような計算を行うためのアドバイスを誰かに教えてもらえますか?

編集

メインテーブル

---+------+-------------+---------+-------+
id | name | address     | country | plz   | ...
---+------+-------------+---------+-------+
20 | Sony | Main Str. 1 | US      | 10000 |
---+------+-------------+---------+-------+

2番目のテーブル

---+------+-------------+---------+-------+
id | name | address     | country | plz   | ...
---+------+-------------+---------+-------+
30 | Soni | MainStr. 1  | US      | 10000 |
---+------+-------------+---------+-------+

目標(類似性テーブル):

---+---------------+--------------+-----------+
id | id_source_tbl | id_second_tbl| similarity|
---+---------------+--------------+-----------+
1  | 20            | 30           | 0.99      |
---+---------------+--------------+-----------+

simil_valueは、ソーステーブルの会社が2番目のテーブルの会社と同じである可能性を示す値です。

結果は、2つの行が同じ会社を表していることを示しています... 2つのエントリはタイプミスが小さいために異なります...(0.99は類似性であり、非常に高い=>企業は同じです)類似性は針マンで計算されますwunsch gotohアルゴリズム(charとcharを比較し、文字列内の位置などを考慮する...タイプミスは高い類似性値をもたらすはずです)

4

4 に答える 4

1

これは驚異的並列問題のように聞こえるので、最初のステップとして、複数のコアとマシンで分析を行うことができます。

于 2013-01-12T02:14:18.997 に答える
1

通常、大量のデータセットを取得して独自のアルゴリズムを使用してフィルタリングするよりも、MySQLがデータ選択を実行できるようにする方が理にかなっています。あなたがしているのは、かなり単純な結合操作だけのようです。例:

SELECT source_id_column, second_id_column, similarity_column
FROM source_table, second_table
WHERE source_table.similarity_column = second_table.similarity;
于 2013-01-12T02:17:54.657 に答える
0

SQLでは、これを次のように表現します。

t1.idをid1として、t2.idをid2として、calculate_similarity(t1.name、t2.name)をt1クロスジョインt2からの類似性として選択します。

ここで、類似性テーブルを次のように定義します。

create table similarity (
    SimilarityID int not null auto_increment,
    id1 int,
    id2 int,
    similarity float
)

次に、次のように挿入します。

insert into similarity(id1, id2, similarity)
    select t1.id as id1, t2.id as id2,
           calculate_similarity(t1.name, t2.name) as similarity
    from t1 cross join
         t2

SQLエンジンは、類似性の計算だけでなく、並列でクロス結合を実行する必要があります。おそらく、会社が同じ州にあるか、同じ文字で始まることを要求するなど、クエリを制限する方法があります。

于 2013-01-12T02:53:55.033 に答える
0

実際、私は自分で問題を作りました...

私にとっての解決策は次のとおりです:
1)接続を再利用せず、常に対応するResultSetで接続を閉じます
2)トランザクションを使用します
3)スレッドに作業を分割し
ます4)私のように、単一行の結果がある場合(1つの単一のすべての類似点エントリ)そしてこのサブ結果で何かを計算したい(私の場合のように、ランクを計算したいすべての類似点について)、これをJavaで行い、サブ結果を使用します!!!! 後でmysqlで実行する代わりに

私にとっての結果は、3週間ではなく約1日の計算時間です...

助けてくれてありがとう

于 2013-01-15T09:52:32.710 に答える