3

次のスキーマを持つドキュメントのテーブルがあります。

CREATE TABLE Frequency (
  docid VARCHAR(255),
  term VARCHAR(255),
  count int,
PRIMARY KEY(docid, term));

すべてのドキュメントの類似性生スコアを見つけるには、次を使用します。

SELECT a.term, b.term, sum(a.count * b.count) 
FROM Frequency a, Frequency b
Where a.term = b.term

なぜこれが機能するのかはわかりませんが、テスト データで D*DT を実行しました。ここで、DT は D の転置です。

「議会銃法」のような用語のクエリ/テキスト文字列の類似性を計算する必要があります

これにはユニオンとグループ化が含まれると思いますが、クエリの試行はすべて失敗します。

SELECT *
FROM Frequency a, Frequency b, Frequency c
Where a.term = b.term 
UNION
SELECT  a.docid, 'congress' as term, 1 as count 
UNION
SELECT  b.docid , 'gun' as term, 1 as count
UNION 
SELECT  c.docid , 'laws' as term, 1 as count 
Group by docid;

私はこの種の SQL に慣れていないので、私が何をしているのかを理解しようとしているので、物語をいただければ幸いです。

最初のクエリが機能する理由と、2 番目のクエリにどのようにアプローチできるかを説明してください。

4

2 に答える 2

2

簡単に言うと、ここで本当にやりたいことは、新しいタプルをテーブルに追加し、上記の行列転置操作を使用して、この新しいテーブルを古いテーブルと比較することです。必要なのは、これらの新しいキーワードを「マーク」して、クエリの条件に使用できるようにすることです。したがって、この

SELECT b.docid, b.term, SUM(a.count * b.count) 
FROM (SELECT * FROM Frequency
      UNION
      SELECT  'q' as docid, 'congress' as term, 1 as count 
      UNION
      SELECT  'q' as docid, 'gun' as term, 1 as count
      UNION 
      SELECT  'q' as docid, 'laws' as term, 1 as count 
     ) a, Frequency b
WHERE a.term = b.term 
AND a.docid = 'q'
GROUP BY b.docid, b.term
ORDER BY SUM(a.count * b.count);

用語とそれぞれの類似度スコアを含むdocidのリストが表示されます。

于 2013-05-21T09:54:51.927 に答える
0

あなたの質問とコメントは理解できません。

ただし、次のクエリは、3 つの用語すべてを含むすべてのドキュメントについて、3 つの用語の出現回数を示しています。

SELECT a.docid,
       a.count,
       b.count,
       c.count
FROM Frequency AS a
JOIN Frequency AS b ON a.docid = b.docid
JOIN Frequency AS c ON b.docid = c.docid
WHERE a.term = 'congress'
  AND b.term = 'gun'
  AND c.term = 'laws'
于 2013-05-18T19:03:25.920 に答える