У меня есть таблица документов со схемой:
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 и буду благодарен за рассказ, поскольку я пытаюсь понять То, что я делаю, также.
Пожалуйста, объясните, почему работает первый запрос и как я мог бы подходить к второму.
Проще говоря, то, что мы действительно хотим здесь сделать, это добавить новые кортежи в таблицу, а затем сравнить эту новую таблицу со старой, используя операцию переноса матрицы, упомянутую выше. Вам понадобится "отметить" эти новые ключевые слова, чтобы вы могли использовать их для условного выражения в своем запросе. Итак, это
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);
предоставит вам список docids с термином и их соответствующими оценками подобия.
Ваш вопрос и комментарии непонятны.
Но следующий запрос показывает количество вхождений трех терминов для всех документов, которые содержат все три выражения:
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'