Актуальность полнотекстового поиска измеряется в? - PullRequest
15 голосов
/ 26 октября 2008

Я создаю систему викторин, и когда тестировщики вставляют вопросы в Банк вопросов, я должен проверить БД на наличие дублирующих / очень похожих вопросов.

Тестирование MySQL MATCH () ... ПРОТИВ () , наибольшая релевантность, которую я получаю, составляет 30+, когда я тестирую на 100% похожую строку.

Так что же такое актуальность? Процитирую инструкцию :

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

Моя проблема заключается в том, как проверить значение релевантности, если строка является дубликатом. Если он дублируется на 100%, не допускайте его вставки в Банк вопросов. Но если это только так, попросите викторину проверить, вставить или нет. Так как мне это сделать? 30+ для 100% идентичной строки не в процентах, поэтому я пень.

Заранее спасибо.

Ответы [ 3 ]

8 голосов
/ 26 октября 2008

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

Документы, содержащие слова, могут быть запрошены путем сопоставления по условиям поиска. Чтобы определить релевантность, по хитам рассчитывается эвристика, известная как Рейтинг косинусов . Это работает путем построения n-мерного вектора с одним компонентом для каждого из n поисковых терминов. Вы также можете взвесить условия поиска, если хотите. Этот вектор дает точку в n-мерном пространстве, которая соответствует вашим условиям поиска.

Аналогичный вектор на основе взвешенных вхождений в каждом документе может быть построен из инвертированного индекса с каждой осью в векторе, соответствующем оси для каждого поискового термина. Если вы вычислите скалярное произведение этих векторов, вы получите косинус угла между ними. 1.0 эквивалентно cos (0), что предполагает, что векторы занимают общую линию от начала координат. Чем ближе друг к другу векторы, тем меньше угол и ближе косинус к 1,0.

Если вы отсортируете результаты поиска по косинусу (или поместите их в очередь с приоритетами, как это делает mg ), вы получите наиболее релевантное. Более умные алгоритмы релевантности имеют тенденцию возиться с весами поисковых терминов, искажая точечный продукт в пользу терминов с высокой релевантностью.

Если вы хотите немного покопаться, Управление гигабайтами от Bell и Moffet обсуждает внутреннюю архитектуру систем поиска текста.

5 голосов
/ 26 октября 2008

andygeers находится на правильном пути: эти числа не имеют никакого эмпирического значения, кроме их отношения друг к другу и не могут использоваться сами по себе, чтобы определить, что является или не является «точным соответствием». Вы должны определить это самостоятельно. Даже помимо ограничений рейтинга полнотекстового поиска, существует также открытый вопрос о том, что именно вы считаете необходимым для получения «точного соответствия». (Только фактический текст или количество совпадений в soundex считается? Синонимы (например, «диван» и «диван») считаются соответствующими или отличными? Должна ли быть предпринята попытка компенсировать опечатки? И т. Д.)

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

2 голосов
/ 26 октября 2008

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

...