Распознание похожих фраз C#
Разрабатывается система для хранения продуктов и их атрибутов. От поставщиков может поступать товары с одинаковыми по смыслу атрибутами, но у нас уже имеется список атрибутов из базы и нам нужно определить похожие по смыслу атрибуты. Например такие атрибуты как:
Цвет товара, Цвет
Где Цвет товара имеет такой же смысл как и Цвет.
Или например:
Ножи какие-то туристические, Туристические ножи
Эти фразы должны быть распознаны как одинаковые по смыслу и примениться нужное мне значение из базы, чтобы атрибуты товара не дублировались в базе. Как можно проверить это на C#? Есть ли какие-то паттерны или алгоритмы? Может функции самого шарпа?
Ответы (2 шт):
Я бы подошел к этому вопросу с полуавтоматическим и полуручным подходом.
А точнее:
- вбил базы поставщиков и сравнил бы Левенштейном все товары
- создал бы ексель таблицу с результатами где главной первой колонкой выступали бы имена с личной базы товаров
- пройтись по таблице вручную человеком
- Перепроверить по таблице вручную иным человеком
После этого создать анализатор который вычисляет новые товары в базах данных которых нет в таблице что бы они так же перепроверялись вручную во избежание ошибок при будущих пополнениях баз данных
Ссылку на Левенштейна продублирую из комментариев
Работу с Ексель или CSV можно посмотреть здесь
Если у вас предугадываемые данные статичны, то задачу можно отдать нейронным сетям. Но в этом подходе есть один недостаток, а именно данные, ведь чем их больше, чем они точнее, тем лучше работает нейронная сеть.
Давайте покажу самый простейший вариант с использованием ML.Net, нам даже код не придется писать.
Данные. Создадим простой текстовый файл, в котором будем построчно писать то что мы получаем и то, чем оно является, ну и разделим это неким символом:
Окраска|Цвет Расцветка|Цвет Color|Цвет Весовой показатель|Вес Масса|Вес Нож туристический с фиксированным клинком|Туристические ножи Туристический нож Киридаши|Туристические ножи Скелетный нож туриста|Туристические ножи Стол арт. 26584|Стол Стол артикул 68245|Стол Стол красный|Стол Стол на металлических ножках|Стол Стул арт. 83576|Стул Стул артикул 12745|Стул Стул с подлокотниками|Стул Стул игровой|Стул
Как видите, простая табличка с неким наброском тестовых даных.
Создание модели.
Жмем в студии правой кнопкой по проекту, добавить, там будет "ML.Net" или как вон в современных "Модель машинного обучения"

Должен открыть окно с выбором сценария, нас интересует "Классификация данных".
Далее спросит на какой машине производить вычисления (я выберу свою).
На следующем этапе попросит данные для анализа, выбираем там наш заготовленный текстовый файл, смотрим чтоб в табличке было все как надо, а также выбираем "Column to predict" - та колонка, которую нейронка должна предугадать.

На следующем шаге уже можно запустить процесс обучения. Этот механизм будет циклично прогонять одни и те же данные, но с разными алгоритмами, выбирая тот, который даст более точный результат. Время - чем больше, тем лучше, но и зависит от размера файла с данными. Я лично запущу на 30 сек, ибо файлик всего и пары строк. Обратите внимание на значение "наилучшая точность" - чем чище у вас данные, чем их больше, точнее, тем лучше этот показатель, а значит и лучше будет результат. Мои данные выдали всего
0.49попугаев, но для теста думаю хватит.На следующем этапе вы уже можете попробовать свою модель, написав там входные значения.
Ну и на последнем этапе, он предложит создать консольный проект, куда поместит вашу натренированную модель и покажет, как с ней обращаться.
Код. Давайте теперь опробуем нашу модель. В созданном консольном проекте мы можем менять все, что захотим, как захотим, но сейчас нас интересует лишь посмотреть на полученный результат. Давайте напишем такой простой код, запустим, ну и посмотрим что скажет:
using MLModel1_ConsoleApp1; while (true) { Console.Write("Текст: "); MLModel1.ModelInput sampleData = new() { Col0 = Console.ReadLine() }; var result = MLModel1.Predict(sampleData); Console.Write($"Результат: {result.PredictedLabel}\n\n"); }
Результат выполнения:
Текст: Нож, сталь d2, с рукоятью серого цвета
Результат: Туристические ножиТекст: Цуиет изделия
Результат: ЦветТекст: Вес изделия
Результат: ЦветТекст: Вес
Результат: ЦветТекст: Стол коричневого цвета со спинкой
Результат: СтолТекст: Стул на колесика
Результат: СтулТекст: Игровой стол с регулировкой уровня
Результат: СтолТекст: Нож
Результат: Туристические ножи
Как видите, даже ничтожные 0.49 "попугаев" выдали весьма такой относительно хороший результат. Стул от стола разделяет, может догадываться аж по целым предложениям к чему относится оно, проглатывает ошибки, опечатки. Заметьте кстати, что "Вес" он принимает за "Цвет" - это наглядно показывает то, что модели нахватает данных, ибо для веса в моем текстовом документе всего 2 значения. Так что, кол-во данных, их качество и прочие показатели, это очень важно для нейронки! Но даже в таком виде, как по мне, это уже лучше, чем расстояние левенштейна, хотя как знать...