構造化データのセットが与えられたとします。データには問題があることが知られており、何とか一貫性を保つためにそれらを「スコア付け」する必要があります。例えば、私は、以下に示すようなデータを持っている:だから組み合わせで比較的多くのデータが第3行目のレコードと比較してあるので、最初の行が正しいエントリであると考えられると仮定データセット内の一貫性スコア付け
fieldA | fieldB | fieldC
-------+--------+-------
foo | bar | baz
fooo | bar | baz
foo | bar | lorem
.. | .. | ..
lorem | ipsum | dolor
lorem | upsum | dolor
lorem | ipsum | baz
。 2行目では、fieldA
の値はfoo
である必要があります(スペルが間違っているため一致しません)。次に、3番目の行でfieldC
の値は、(foo
)とfieldB
(bar
)の同様の値を持つデータセット内の他の項目と同様に、baz
になるはずです。
また、データセットの他の部分には、比較的一般的な別の組み合わせがあります(lorem
,、dolor
)。したがって、以下のレコードの問題は、前述のものと同じです。値の組み合わせが異なるだけです。
最初にすべてをSQLデータベースにダンプし、GROUP BY
のステートメントを使用してフィールド値の一貫性をチェックしました。一貫性と各レコードのチェックを行うフィールドごとに1つのクエリがあります。レコードのfieldA
の値が(以前のSQLクエリの処理結果)以下のオブジェクトにレコードを参照することにより、他の部分と一致している場合
SELECT fieldA, count(fieldA)
FROM cache
WHERE fieldB = 'bar' and fieldC = 'baz'
GROUP BY fieldA
それから私はチェックすることができます。それは非常に遅かったしかし
{'foo': {'consistency': 0.99, 'count': 99, 'total': 100}
'fooo': {'consistency': 0.01, 'count': 1, 'total': 100}}
(データセットを約2.2millionレコードを持っている、と私はそう9milクエリについて作り、4つのフィールドをチェックしています)、および完了するまでに半日かかるだろう。その後、SQLストレージをelasticsearchに置き換え、処理時間を約5時間に短縮しました。
また好奇心の外に、私はここで車輪を発明していますか?これには既存のツールがありますか?現在は、elasticsearchを使用してPython3で実装されています。
私は解決策を見る時間がありません。複数の用語で項目に「スコアを付ける」ことができますか?例えば"foo bar"対 "fooz bar" – Jeffrey04
もうまくいくはずです。 difflibはハッシュを使って比較します。何でもハッシュ可能です。 – klaas
笑、私は必要なツールのように見えません。なぜなら、私は手前の各フィールドに対して、(相対的に)正しい正準値と組み合わせをすべて持っているわけではないからです。 – Jeffrey04