Связанные строки на основе текстовых столбцов - PullRequest
2 голосов
/ 31 июля 2010

Учитывая, что у меня есть таблица со столбцом TEXT (MySQL или SQlite), можно ли использовать значение этого столбца таким образом, чтобы я мог найти похожие строки с несколько связанными текстовыми значениями?

Например, если я хочу найти связанных строк до row_3 - оба значения 1 и 2 будут соответствовать:

row_1 = this is about sports
row_2 = this is about study
row_3 = this is about study and sports 

Я знаю, что мог бы использовать FULLTEXT или FTS3, если бы у меня было ключевое слово, которое я хотел MATCH сопоставить со значениями столбца - но я просто пытаюсь найти текст, который несколько связан между строками.

Ответы [ 3 ]

3 голосов
/ 31 июля 2010

MySQL поддерживает опцию полнотекстового поиска под названием QUERY EXPANSION. Идея состоит в том, что вы ищете ключевое слово, оно находит строку, а затем использует слова в этой строке как ключевые слова для поиска более подходящих строк.

SELECT ... FROM StudiesTable WHERE MATCH(description_text) 
  AGAINST ('sports' IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION);

Читайте об этом здесь: http://dev.mysql.com/doc/refman/5.1/en/fulltext-query-expansion.html

1 голос
/ 31 июля 2010

Может быть, было бы достаточно взять каждое соответствующее слово (более 4 букв? Или сравнивать со списком общих слов?) В базовой строке, используя их в качестве ключевых слов для полнотекстового поиска и построения таблицы tmp (id, row_matched_id, count ) записывать совпадения для каждой строки, добавляя 1, чтобы подсчитать, когда она совпадает. В конце вы получите в таблице tmp все совпадающие строки и количество совпадений (сколько релевантных слов было одинаковым).
Если вы хотите запустить его один раз для всей базы данных и сохранить результаты используйте постоянную таблицу, добавьте столбец для идентификатора базовой строки и выполните поиск для каждой новой вставленной (или обновленной) строки, чтобы обновить таблицу результатов.
Используя эту таблицу результатов, вы можете быстро найти строки, соответствующие большему количеству слов базовой строки, не выполняя поиск снова.

Редактировать: с помощью этого можно «оценить» результаты, например, если вы подсчитываете x релевантных слов в базовой строке, вы можете вычислить оценку в% как (соответствует / x * 100) и отфильтровать все результаты с пример менее 50% совпадений. В вашем примере каждая строка_1 и строка_2 дают 50%, если рассматривать релевантные слова только с более чем 4 буквами, или 67%, если вы учитываете все слова.

1 голос
/ 31 июля 2010

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

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

Первая подсказка заключается в том, что вы хотите получить доступ / индексировать данные не по полной текстовой строке, а по фрагменту слова или предложения (если вы не заинтересованы в словах, которые пишутся одинаково при сопоставлении, что сложнее).

В качестве примера одного метода, сгенерируйте цепочку из ваших предложений, захватывая перекрывающиеся наборы из трех слов, и сохраните цепочку. Затем вы можете искать записи, которые имеют большое количество общих сегментов цепи. Набор сегментов цепочки для ваших утверждений выше:

row_1 = это о спорте

row_2 = это об учебе

row_3 = это об учебе и спорте

  • это примерно (3 матча)
  • о спорте
  • об учебе (2 матча)
  • об учебе и
  • учеба и спорт
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...