Точный алгоритм нормализации терминов таксономии? - PullRequest
2 голосов
/ 14 сентября 2010

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

В чем моя проблема: пожалуйста, во-первых, мы используем Apache Solr с Drupal, НО, эта проблема не является специфичной для Drupal или Solr, если вы не знаете их, это не имеет значения.

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

Предположим, что у меня на сайте есть фасет "Narrow by Brands". Теперь предположим, что 100 продавцов предлагают продукты от Microsoft. Теперь приходит проблема. Некоторые продавцы помещают в столбец «Бренды» фид данных «Microsoft», другие «Microsoft, Inc.», другие «Microsoft Corporation», другие «Продукты от Microsoft» и т. Д. некоторые отдельные торговцы настолько небрежны, что имеют разные строки для одной и той же марки в одном и том же потоке данных.

Мы не хотим, чтобы все эти разные бренды появлялись в навигации. У нас есть ручное решение проблемы, когда мы вручную сопоставляем импортированные бренды с таблицей «хороших» брендов («Microsoft Corporation» -> «Microsoft», «Продукты от Microsoft» -> «Microsoft» и т. Д.). У нас есть около 10000 брендов в базе данных, и это выполнимо. Проблема в том, что когда речь идет о более крупных вещах, таких как «Авторы». Когда мы импортируем книги в систему, существует более 800 000 авторов, и у нас возникает та же проблема, и это невозможно решить вручную. Проблема та же: «Том Майк Апостол», «Том М. Апостол», «Апостол, Том М.» и т. Д. *

Кто-нибудь знает хороший способ автоматического решения этой проблемы с приемлемой степенью точности (точность 85% -95%)?

Спасибо вам за помощь!

1 Ответ

0 голосов
/ 14 сентября 2010

Некоторая идея, которая приходит мне в голову, хотя это просто бесполезная мысль:

  1. Преобразование имен в инициалы (в вашем примере: TMA).Относитесь к '-' как к пробелам, т. Е.Антуан де Сент-Экзюпери будет ADSE.Проблема здесь в том, как обрабатывать «,», хотя, как правило, фамилия стоит перед именем, поэтому просто поменяется местами (так что A, TM - это TM, A, избавьтесь от запятой - TMA).
  2. Отфильтровывает авторов в базе данных по этим инициалам
  3. Для каждого инициала, если у вас есть полное имя (Том, ​​Апостол), проверьте, совпадает ли оно, в противном случае (М.) сочтите его совпадением автоматически.
  4. Если вам нужна некоторая толерантность, вы можете сравнить имена с расстоянием Левенштейна и допустить некоторые различия ( здесь у вас есть реализация Oracle)
  5. Имена, которые соответствуют вам, относятся к тем же авторам, чтобы найтиполное имя, для каждого инициала (T, M, A) вы ищите отфильтрованных авторов (после шага 2) и пытаетесь найти его не просто с инициалом (M.), но с полным именем (Майк), если вы не можетенайти один, использовать начальный.Таким образом, каждый из приведенных вами примеров будет преобразован в одно и то же значение, которое будет полным именем (Том Майк Апостол).

Вещи, о которых стоит подумать:
Включение сопоставлений для именисинонимы (скорее всего, это будут максимум сотни записей, как, например, Томас <-> Том
. Этот способ крайне важен для правильных инициалов (без M вместо N и т. д.).

edit: я закодировалтакое случалось некоторое время назад, когда мне приходилось идентифицировать человека по его подписи, игнорируя проблемы со сканированием, люди иногда подписывали по имени С. Фамилия или NS или просто по имени Фамилия (что, возможно, следует учитывать при решении,чтобы позволить алгоритму игнорировать второе имя, хотя в вашей ситуации было бы довольно редко пропускать чье-то второе имя, я думаю).

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