поиск по ключевому слову / фразе против сходства Matrix в SQLite

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 и буду благодарен за рассказ, поскольку я пытаюсь понять То, что я делаю, также.

Пожалуйста, объясните, почему работает первый запрос и как я мог бы подходить к второму.

  • 0
    Как определяется «сходство» в этом случае?
  • 0
    В столбце подсчета указано количество совпадений термина, обозначающего отдельный термин, например, «конгресс».
Показать ещё 4 комментария
Теги:
similarity

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);

предоставит вам список docids с термином и их соответствующими оценками подобия.

  • 0
    Это потрясающе!!
  • 0
    Спасибо большое! Пятно на! Крис
Показать ещё 1 комментарий
0

Ваш вопрос и комментарии непонятны.

Но следующий запрос показывает количество вхождений трех терминов для всех документов, которые содержат все три выражения:

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'
  • 0
    Приведенный выше код не возвращает никаких результатов;
  • 0
    Этот код возвращает результаты, но не ограничивает документ содержанием всех трех терминов, например, docid «AA», термин конгресс, оружие, законы: SELECT a.docid, a.term, a.count FROM Frequency a JOIN (SELECT 'q' в качестве docid, «вашингтон» в качестве термина, 1 в качестве подсчета UNION SELECT «q» в качестве docid, «налогов» в качестве термина, 1 в качестве подсчета UNION SELECT «q» в качестве docid, «сокровищница» в качестве термина, 1 в качестве count) b ON a .term = b.term ГДЕ a.term = «вашингтон» ИЛИ a.term = «налоги» ИЛИ a.term = «казначейство» GROUP BY a.docid, a.term; Любое предложение, пожалуйста.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню