Лучший способ создания алгоритма изменения персонажа.Создание таблицы синонимов - PullRequest
3 голосов
/ 15 июля 2011

Мне нужно создать таблицу вариантов / синонимов для клиента, который должен убедиться, что если кто-то введет неправильную переменную, мы можем вернуть правильную часть.

Пример, если у нас есть ID детали GRX7-00C. Когда клиент вводит это в таблицу деталей, он хотел бы автоматически создать таблицу вариантов, в которой будут храниться варианты, которыми может быть этот продукт. Как GBX7-OOC (буква O вместо числа 0). Или, если они имеют номер 1, чтобы иметь возможность использовать L или I.

Таким образом, если у нас есть часть GRL8-OOI, у нас может быть следующее, связанное с ней в таблице вариантов:

  • GRI8-OOI
  • GRL8-0OI
  • GRL8-O0I
  • GRL8-OOI
  • и т.д ....

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

Я полностью озадачен тем, как это сделать в C # и / или SQL.

Спасибо!

Ответы [ 4 ]

4 голосов
/ 15 июля 2011

Я не программист на C #, но для других языков .NET для меня было бы более целесообразно создать список CHARACTERS , которые похожи, и сгруппировать их вместе, и использовать RegEx для оценкиесли он совпадает.

то есть для вашего примера:

Оригинал:

GRL8-001

Регулярное выражение:

GR(l|L|1)(8|b|B)-(0|o|O)(0|o|O)(1|l|L)

Этого можно добиться, имея таблицу взаимозаменяемых символов и запустив функцию замены для автоматической замены RegEx для символа.

3 голосов
/ 16 июля 2011

Функция Lookex psuedocode (работает как soundex, но похож на звук, а не на звук)

string input
for each char c
  if c in "O0Q" c = 'O'
  else if c in "IL1" c = 'I'
  etc.

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

0 голосов
/ 18 июля 2011

Я бы вообще не пошел по синониму.

Я бы очистил все значения в базе данных, используя стандартный набор правил.

Для каждого существующего значения замените все «0» на «O», удалите черточки и т. Д., Чтобы для каждого реального значения было только одно измененное значение, и сохраните его в отдельном поле \ table.

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

Теперь для ввода: GRL8-ОЦ1

С частями: GRL8-00I и GRL8-OOI

Все они нормализуются к одному и тому же значению GRL8OOI, хотя совпадение расстояний будет ближе для GRL8-OOI, так что это будет ваша ближайшая ставка.

Конечно, это значительно снижает "уникальность" ваших номеров деталей, но комбинация из двух частей и Левенштейна должна дать вам то, что вы ищете.

Существует несколько реализаций T-SQL Левенштейна доступно

0 голосов
/ 15 июля 2011

Учитывая ваши данные выше, я бы не стал хранить таблицу синонимов, а вместо этого проверил набор правил по основному словарю.Например, если пользователь вводит значение, которого нет в словаре, измените O на 0 и проверьте, существует ли оно в словаре.Измените GR на GB и проверьте это.И т.д. Все варианты, которые они хотят разрешить, описанные выше, могут быть объяснены как правила, которые вы можете применять по одному или в комбинации и проверять, существует ли полученная запись.Таким образом, вам не нужно иметь большой словарь синонимов для поддержки и обновления.

...