powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Нормализация строк
37 сообщений из 37, показаны все 2 страниц
Нормализация строк
    #40103814
Mixon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый!
Подскажите как определить что
"Яблочное пюре" и "Пюре яблочное" в принципе одно и тоже, данные как пример, слова могут видо изменяться типа "Пюре из яблок".

Заранее спасибо за советы!
...
Рейтинг: 0 / 0
Нормализация строк
    #40103815
Никанор Кузьмич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Встречный вопрос: "человек разумный" и "разумный человек" - это в принципе одно и то же или нет?
...
Рейтинг: 0 / 0
Нормализация строк
    #40103839
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В данном случае можно разбить на слова и отсортировать по алфавиту, но это не всегда работает, есть исключения когда порядок слов играет роль.
Сходу пример не придумаю, близкое: "копчено-вареный" и "варено-копченый" это два разных способа приготовления.
...
Рейтинг: 0 / 0
Нормализация строк
    #40103842
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По хорошему надо какую-то классификацию слов вводить. Например в данном случае слово "пюре" это форма выпуска, "яблочное" это вкус. Для нормализации достаточно например идентифицировать форму выпуска и убрать в сторону как признак товара. Тогда сначала отдельно сравниваем форму, а если совпала, то остальное. Но в остальном тоже могут быть подставы типа "Пюре яблочное с корицей".
...
Рейтинг: 0 / 0
Нормализация строк
    #40103868
WebSharper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное, как-то так
...
Рейтинг: 0 / 0
Нормализация строк
    #40103910
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WebSharper
Наверное, как-то так

Нет, распознавание речи тут мало поможет. Оно заточено на разговорный язык.
Наименования товаров далеки от обычного разговорного, это не связное предложение, а набор характеристик, причем многие написаны сокращенно.
...
Рейтинг: 0 / 0
Нормализация строк
    #40103923
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Х-ха! Семантику по грамматике ))
Меня однажды попробавали нагнуть автоматизацией поиска в инете. По названию товара неизвестно где выявить его цену))
...
Рейтинг: 0 / 0
Нормализация строк
    #40104164
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mixon
День добрый!
Подскажите как определить что
"Яблочное пюре" и "Пюре яблочное" в принципе одно и тоже, данные как пример, слова могут видо изменяться типа "Пюре из яблок".

Заранее спасибо за советы!

Мы находимся не в гуманитарном, а в техническом форуме. И поэтому задача должна быть поставлена технически.

В противном случае - она просто переходит в область ЗПТ или дискуссий ВопросОтвет.

Давайте перечислим алгоритмы нормализации строк Русского языка .
Я делаю упор на Русский язык потому-то нормализация другого языка
будет скорее всего совсем другим алгоритмом. Как "сумма прописью".

Потом поищем готовые реализации этих алгоритмов.

И потом поищем справочники слов или базы данных если таковые нужны.
...
Рейтинг: 0 / 0
Нормализация строк
    #40104175
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mixon
Подскажите как определить что
"Яблочное пюре" и "Пюре яблочное" в принципе одно и тоже, данные как пример, слова могут видо изменяться типа "Пюре из яблок".

Заранее спасибо за советы!

Необходимо ввести расстояние между названиями: когда решал подобную задачу для наименований алкоголя, использовал расстояние Левенштейна (РЛ) и "ручной подбор", т.е. оператор для каждого наименования видел отсортированный по РЛ список кандидатов, оттуда и выбирал, так строился справочник. Сейчас можно попробовать вместо РЛ использовать какой-нибудь Word2Vec и считать расстояние между векторами.
Конкретная реализация, думаю, должна зависеть от предметной области: сколь автоматическим/точным должен быть подбор, сколько и каких строк нужно сравнивать (список названий или произвольные тексты).
...
Рейтинг: 0 / 0
Нормализация строк
    #40104190
Ы2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mixon, можно попробовать использовать триграммное сходство. Например, его реализация в PostgreSQL считает, что «яблочное пюре» и «пюре яблочное» не различаются вовсе, а сходство любой из этих строк с «пюре из яблок» около 47%.
...
Рейтинг: 0 / 0
Нормализация строк
    #40104196
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ы2
Mixon, можно попробовать использовать триграммное сходство. Например, его реализация в PostgreSQL считает, что «яблочное пюре» и «пюре яблочное» не различаются вовсе, а сходство любой из этих строк с «пюре из яблок» около 47%.

А "яблочная репа" будет ближе к "яблочному пюре" нежели чем "пюре из яблок".

Вот такой метафизический парадокс.
...
Рейтинг: 0 / 0
Нормализация строк
    #40104233
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Давайте перечислим алгоритмы нормализации строк Русского языка .

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

Штрихкод легко решает все проблемы на 99%
...
Рейтинг: 0 / 0
Нормализация строк
    #40104237
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ы2
Mixon, можно попробовать использовать триграммное сходство. Например, его реализация в PostgreSQL считает, что «яблочное пюре» и «пюре яблочное» не различаются вовсе, а сходство любой из этих строк с «пюре из яблок» около 47%.

Жёлтый и белый тоже очень похожи по написанию
...
Рейтинг: 0 / 0
Нормализация строк
    #40104358
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Штрихкод - это не тема топика вроде как.
...
Рейтинг: 0 / 0
Нормализация строк
    #40104443
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точно также поступил, когда нормализовывал улицы, писанные вразнобой.
x1ca4064
Необходимо ввести расстояние между названиями ... "ручной подбор" ...
должна зависеть от предметной области
Ещё использовал модель ошибок в написании. Т.к. из подвохов могут быть латинские вместо русских и наоборот, очепятки-перестановки, регистр и прочее. МО - почти единственное, могущее быть для универсальной нормализации.
Ещё подвох - омонимы и какая-никакая контекстная зависимость.
...
Рейтинг: 0 / 0
Нормализация строк
    #40104450
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Штрихкод - это не тема топика вроде как.

Я так понимаю ТС хочет находить одинаковые товары по разному написанные. Большинство товаров нынче имеют штрихкод.
...
Рейтинг: 0 / 0
Нормализация строк
    #40104488
Ы2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Ы2
Mixon, можно попробовать использовать триграммное сходство. Например, его реализация в PostgreSQL считает, что «яблочное пюре» и «пюре яблочное» не различаются вовсе, а сходство любой из этих строк с «пюре из яблок» около 47%.

Жёлтый и белый тоже очень похожи по написанию

Это вам только кажется. У них триграммное сходство 8,3%.
...
Рейтинг: 0 / 0
Нормализация строк
    #40104522
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
mayton
Штрихкод - это не тема топика вроде как.

Я так понимаю ТС хочет находить одинаковые товары по разному написанные. Большинство товаров нынче имеют штрихкод.

Вернемся к яблокам.

Для данного частного случая:

Код: java
1.
Яблочное пюре - пюре из яблок



Я-бы предложил следующее.

Триграммный поиск - не вариант т.к. тут не опечатка а морфологическое преобразование.
Нам нужно все слова и выражения свести к единой основе.

Код: sql
1.
ЯБЛОКО ПЮРЕ



и обеспечить правильный порядок. Можно задать ранг слов или положить их в SortedSet.

По триграммам. Про близость "пюре" и репа я уже писал. Надо практически посмотреть и взять хотя-бы штук 100-200
реальных названий и прогнать их по тесту.

Короче сложность решения задачи сильно зависит от качества самих исходных данных. Триграммы и биграммы и прочие N-граммы
это - слишком простой подход. Он может даже и не на текст ориентирован на например на генетику (биологию)
и он может хорошо работать в одних случаях, а в случаях с мофологией и лемматизацией он может просто
давать очень плохие результаты.
...
Рейтинг: 0 / 0
Нормализация строк
    #40104568
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ы2
Dima T
пропущено...

Жёлтый и белый тоже очень похожи по написанию

Это вам только кажется. У них триграммное сходство 8,3%.

Триграмное да, а левенштейн очень близок, выделил совпадающие буквы: ЖЕЛТЫЙ БЕЛЫЙ
...
Рейтинг: 0 / 0
Нормализация строк
    #40104581
Ы2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, близость «пюре» и «репа» — еще более мнимая, чем «желтый» и «белый»: триграммное сходство 0%, РЛ = 4 и равно длине слова.

«яблочная репа» дальше от «яблочное пюре» (27%), чем «пюре из яблок» (47%).

Вы ошибочно полагаете, что триграммное сходство — для поиска опечаток. Оно для поиска строк, совпадающих по большей части . Для опечаток — расстояние Левенштейна.

Поэтому, на мой взгляд, самое простое решение — сформировать по триграммам список кандидатов на отождествление и отдать оператору, пусть решает вручную.
...
Рейтинг: 0 / 0
Нормализация строк
    #40104607
Ares_ekb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если решать в лоб, то можно
1) составить словарь нормализованных строк
2) посчитать для этого словаря N-граммы
3) затем для входных строк применять какую-нибудь очистку, если требуется (с помощью регулярных выражений и т.п.)
4) вычислять для них такие же N-граммы
5) сравнивать их с N-граммами из словаря, можно просто перемножением векторов, можно с помощью TF-IDF
6) установить порог, выше которого считаем, что строки похожи, например, 0.8 (подбирается экспериментально путём подсчета ошибок при разных значениях)
7) если в словаре найдено похожее слово, с мерой похожести выше порога, то считаем его нормализованным представлением строки
8) скорее всего, алгоритм не будет давать 100% результат, смотрим что получается и дальше накручиваем ещё какие-нибудь эвристики

Я, например, использовал такой подход для нормализации адресов. В качестве словаря использовал ФИАС. Использовал биграммы, а не триграммы (тут можно поэкспериментировать). Использовал кучу регулярок для разбиения адреса на части (регион, город, улица, дом и т.д.) и сравнивал каждую часть адреса отдельно, потому что очень много похожих слов типа Свердловская область, улица Свердлова, проспект Свердлова и т.п. Если сравнивать регионы, улицы и т.п. отдельно, то это существенно улучшает алгоритм. Плюс для ускорения и оптимизации можно сначала определить регион, а потом искать совпадения уже внутри него.

Соответственно вы тоже можете попробовать использовать эти штуки (если это применимо):
1) Разбить строку на части, сравнивать слова отдельно
2) Каким-то образом отнести строку к одной из подкатегорий и сравнивать только со строками этой категории
3) Использовать регулярки для предварительной очистки или разбиения строк

Ещё можно посмотреть https://yandex.ru/dev/mystem/ может пригодится.

И конечно же можно посмотреть https://rusvectores.org/ Они как и N-граммы позволяют превращать слова в векторы, но(!) таким образом, что близкие по смыслу слова имеют близкие векторы. Это позволяет делать вещи типа семантических калькуляторов, поиска аналогий, поиска похожих вещей и т.п.
...
Рейтинг: 0 / 0
Нормализация строк
    #40104616
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Погуглил немного, вот реальные наименования из предложений в инете:
Код: sql
1.
2.
3.
ФРУТОНЯНЯ ПЮРЕ ЯБЛОЧНОЕ 100,0
ФрутоНяня Пюре яблоко натур 100г N 1
Пюре ФрутоНяня Яблоко с 4 месяцев 100.000 г



А есть еще такие:
Код: sql
1.
2.
Пюре ФрутоНяня Груша с 4 месяцев 100.000 г
Фрутоняня пюре 100 г груша/яблоко


Можно еще поискать
...
Рейтинг: 0 / 0
Нормализация строк
    #40104634
Ы2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Погуглил немного, вот реальные наименования из предложений в инете:
Код: sql
1.
2.
3.
ФРУТОНЯНЯ ПЮРЕ ЯБЛОЧНОЕ 100,0
ФрутоНяня Пюре яблоко натур 100г N 1
Пюре ФрутоНяня Яблоко с 4 месяцев 100.000 г



А есть еще такие:
Код: sql
1.
2.
Пюре ФрутоНяня Груша с 4 месяцев 100.000 г
Фрутоняня пюре 100 г груша/яблоко


Можно еще поискать


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
with a (t) as (
	values ('ФРУТОНЯНЯ ПЮРЕ ЯБЛОЧНОЕ 100,0'),
		('ФрутоНяня Пюре яблоко натур 100г N 1'),
		('Пюре ФрутоНяня Яблоко с 4 месяцев 100.000 г'),
		('Пюре ФрутоНяня Груша с 4 месяцев 100.000 г'),
		('Фрутоняня пюре 100 г груша/яблоко')
)
select
	a.t,
	b.t,
	similarity(a.t, b.t)
from a, a as b
where a.t <> b.t
order by similarity desc;



вариант 1вариант 2сходствоПюре ФрутоНяня Яблоко с 4 месяцев 100.000 гПюре ФрутоНяня Груша с 4 месяцев 100.000 г0.75Пюре ФрутоНяня Груша с 4 месяцев 100.000 гПюре ФрутоНяня Яблоко с 4 месяцев 100.000 г0.75Пюре ФрутоНяня Яблоко с 4 месяцев 100.000 гФрутоняня пюре 100 г груша/яблоко0.5833333Фрутоняня пюре 100 г груша/яблокоПюре ФрутоНяня Яблоко с 4 месяцев 100.000 г0.5833333Фрутоняня пюре 100 г груша/яблокоФРУТОНЯНЯ ПЮРЕ ЯБЛОЧНОЕ 100.00.575ФРУТОНЯНЯ ПЮРЕ ЯБЛОЧНОЕ 100.0Фрутоняня пюре 100 г груша/яблоко0.575Фрутоняня пюре 100 г груша/яблокоФрутоНяня Пюре яблоко натур 100г N 10.5681818ФрутоНяня Пюре яблоко натур 100г N 1Фрутоняня пюре 100 г груша/яблоко0.5681818Фрутоняня пюре 100 г груша/яблокоПюре ФрутоНяня Груша с 4 месяцев 100.000 г0.5416667Пюре ФрутоНяня Груша с 4 месяцев 100.000 гФрутоняня пюре 100 г груша/яблоко0.5416667ФРУТОНЯНЯ ПЮРЕ ЯБЛОЧНОЕ 100.0ФрутоНяня Пюре яблоко натур 100г N 10.5ФрутоНяня Пюре яблоко натур 100г N 1ФРУТОНЯНЯ ПЮРЕ ЯБЛОЧНОЕ 100.00.5Пюре ФрутоНяня Яблоко с 4 месяцев 100.000 гФРУТОНЯНЯ ПЮРЕ ЯБЛОЧНОЕ 100.00.48979592ФРУТОНЯНЯ ПЮРЕ ЯБЛОЧНОЕ 100.0Пюре ФрутоНяня Яблоко с 4 месяцев 100.000 г0.48979592ФрутоНяня Пюре яблоко натур 100г N 1Пюре ФрутоНяня Яблоко с 4 месяцев 100.000 г0.46296296Пюре ФрутоНяня Яблоко с 4 месяцев 100.000 гФрутоНяня Пюре яблоко натур 100г N 10.46296296Пюре ФрутоНяня Груша с 4 месяцев 100.000 гФРУТОНЯНЯ ПЮРЕ ЯБЛОЧНОЕ 100.00.39215687ФРУТОНЯНЯ ПЮРЕ ЯБЛОЧНОЕ 100.0Пюре ФрутоНяня Груша с 4 месяцев 100.000 г0.39215687ФрутоНяня Пюре яблоко натур 100г N 1Пюре ФрутоНяня Груша с 4 месяцев 100.000 г0.30508474Пюре ФрутоНяня Груша с 4 месяцев 100.000 гФрутоНяня Пюре яблоко натур 100г N 10.30508474

Не идеально, конечно, но можно начинать что-то городить вокруг этого.
...
Рейтинг: 0 / 0
Нормализация строк
    #40104640
Ares_ekb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ы2
но можно начинать что-то городить вокруг этого
Например, с помощью регулярок отделить массу и возраст. Ещё можно составить отдельные словари для типов продукции (пюре), для сырья (яблоко, груша), для брендов (ФрутоНяня), сначала можно сопоставлять отдельные слова, каждое из них приводить к нормализованному виду (как в словаре), а затем уже сопоставлять всю строку, в которой каждое отдельное слово уже нормализовано. Не знаю даст это что-то или нет, но в таких задачах первый шаг делается легко, но потом разобраться со всякими крайними случаями - целая история.

Тут ещё непонятен вопрос. Нужно сравнивать все строки со всеми, тогда это задача кластеризации. Либо всё-таки есть словарь правильных, нормализованных строк, и нужно сравнивать новые строки со словарем.
...
Рейтинг: 0 / 0
Нормализация строк
    #40104647
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ы2
Код: sql
1.
where a.t <> b.t


Чтобы не двоилось лучше так
Код: sql
1.
where a.t > b.t



Ы2
Не идеально, конечно, но можно начинать что-то городить вокруг этого.

ИМХО, как выше написали, начинать надо с выделения характеристик: брэнд, тип, вкус, вес и т.д. а дальше нераспознанное можно этим способом досравнивать.
...
Рейтинг: 0 / 0
Нормализация строк
    #40104649
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот этот суффикс типа

Код: sql
1.
4 месяцев 100.000 г



тоже может сильно изменить формулу дистанции. Могут быть ложные срабатывания для других товаров.

Кстати этот similarity(..) какой алгоритм использует?
...
Рейтинг: 0 / 0
Нормализация строк
    #40104696
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Погуглил немного, вот реальные наименования из предложений в инете:
А есть еще такие:
Можно еще поискать
Dima , Ы2, отставить спам, отставить брутальную рекламу брэнда ... ))
...
Рейтинг: 0 / 0
Нормализация строк
    #40104705
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98
Dima T
Погуглил немного, вот реальные наименования из предложений в инете:
А есть еще такие:
Можно еще поискать
Dima , Ы2, отставить спам, отставить брутальную рекламу брэнда ... ))

Что первое гугл выдал, то и скопипастил. Хорошо в рекламу вкладываются видать. Так что наше упоминание им продажи не увеличит.
А в остальном этот бренд гадость редкостная, когда дети маленькие были жена говорила не брать его ни при каком раскладе
...
Рейтинг: 0 / 0
Нормализация строк
    #40104712
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Могут быть ложные срабатывания для других товаров.
А как определить близость 1 кг помидоров и 1 кг томатов?
У нас в Перекрёстки с недавних лет помидоров не стало, их постепенно вытеснили томаты. А так хочется помидорчиков!
А что в других регионах?
...
Рейтинг: 0 / 0
Нормализация строк
    #40104714
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Вот этот суффикс типа
Код: sql
1.
4 месяцев 100.000 г

Наверняка это другие поля из БД, тогда на них метрика не распространится. А "чеснок фасованный" и в развес ??
Не знаю новейших практик. М.б. подобное уже зашивают в классификациютоварных групп?
Например одежда изначально классифицировалась матрично: цвето-размер.

Прикол по случаю
В маге на стенке есть считыватели штрих-кода, чтоб мы сами цену узнавали. Иногда они зависают. Раз я взял и перезапустил девайс, а там загрузился маленький Виндовс. Не помню, то ли через "Пуск" загрузил прогу, или не удалось...
...
Рейтинг: 0 / 0
Нормализация строк
    #40104719
Ares_ekb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98,

Можно тут найти похожие слова для "помидор" https://rusvectores.org/
авторогурец 0.775
морковь 0.726
овощ 0.711
баклажан 0.706
капуста 0.704
арбуз 0.701
салат 0.690
чеснок 0.687
томат 0.684
фасоль 0.670

Помидор больше похож на огурец, чем на томат. На этот случай наверное нужен свой словарь синонимов
...
Рейтинг: 0 / 0
Нормализация строк
    #40104727
Ы2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Вот этот суффикс типа
Код: sql
1.
4 месяцев 100.000 г


тоже может сильно изменить формулу дистанции. Могут быть ложные срабатывания для других товаров.

Кстати этот similarity(..) какой алгоритм использует?


Это функция из расширения pg_trgm для PostgreSQL. Разбирает строки на буквенные триграммы и считает долю общих.
...
Рейтинг: 0 / 0
Нормализация строк
    #40104818
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
    val src = """    Пюре ФрутоНяня Яблоко с 4 месяцев 100.000 г
      Пюре ФрутоНяня Груша с 4 месяцев 100.000 г
      Пюре ФрутоНяня Яблоко с 4 месяцев 100.000 г
      Фрутоняня пюре 100 г груша/яблоко
    Фрутоняня пюре 100 г груша/яблоко
    ФРУТОНЯНЯ ПЮРЕ ЯБЛОЧНОЕ 100.0
    Фрутоняня пюре 100 г груша/яблоко
    ФрутоНяня Пюре яблоко натур 100г N 1
    Фрутоняня пюре 100 г груша/яблоко
    Пюре ФрутоНяня Груша с 4 месяцев 100.000 г
      ФРУТОНЯНЯ ПЮРЕ ЯБЛОЧНОЕ 100.0
    ФрутоНяня Пюре яблоко натур 100г N 1
    Пюре ФрутоНяня Яблоко с 4 месяцев 100.000 г
      ФРУТОНЯНЯ ПЮРЕ ЯБЛОЧНОЕ 100.0
    ФрутоНяня Пюре яблоко натур 100г N 1
    Пюре ФрутоНяня Яблоко с 4 месяцев 100.000 г
      Пюре ФрутоНяня Груша с 4 месяцев 100.000 г
      ФРУТОНЯНЯ ПЮРЕ ЯБЛОЧНОЕ 100.0
    ФрутоНяня Пюре яблоко натур 100г N 1
    Пюре ФрутоНяня Груша с 4 месяцев 100.000 г"""

    val expressions : Array[String] = src.split("\n")
      .map(x => x.trim)
      .map(x => x.toLowerCase())
      .distinct

    println(s"Filtered size : ${expressions.length}")

    expressions.foreach(x => println(s">> $x"))

    import org.apache.commons.text.similarity.LevenshteinDistance
    val distFunc = new LevenshteinDistance()

    for(x <- 0 until expressions.length; y <- 0 until expressions.length) {
      if (x < y) {
        val dist = distFunc.apply(expressions(x), expressions(y))
        println(s"Levenstein distance from (${expressions(y)} - ${expressions(x)}) is $dist")
      }
    }



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
>> пюре фрутоняня яблоко с 4 месяцев 100.000 г
>> пюре фрутоняня груша с 4 месяцев 100.000 г
>> фрутоняня пюре 100 г груша/яблоко
>> фрутоняня пюре яблочное 100.0
>> фрутоняня пюре яблоко натур 100г n 1
Levenstein distance from (пюре фрутоняня груша с 4 месяцев 100.000 г - пюре фрутоняня яблоко с 4 месяцев 100.000 г) is 6
Levenstein distance from (фрутоняня пюре 100 г груша/яблоко - пюре фрутоняня яблоко с 4 месяцев 100.000 г) is 31
Levenstein distance from (фрутоняня пюре яблочное 100.0 - пюре фрутоняня яблоко с 4 месяцев 100.000 г) is 25
Levenstein distance from (фрутоняня пюре яблоко натур 100г n 1 - пюре фрутоняня яблоко с 4 месяцев 100.000 г) is 26
Levenstein distance from (фрутоняня пюре 100 г груша/яблоко - пюре фрутоняня груша с 4 месяцев 100.000 г) is 30
Levenstein distance from (фрутоняня пюре яблочное 100.0 - пюре фрутоняня груша с 4 месяцев 100.000 г) is 24
Levenstein distance from (фрутоняня пюре яблоко натур 100г n 1 - пюре фрутоняня груша с 4 месяцев 100.000 г) is 27
Levenstein distance from (фрутоняня пюре яблочное 100.0 - фрутоняня пюре 100 г груша/яблоко) is 18
Levenstein distance from (фрутоняня пюре яблоко натур 100г n 1 - фрутоняня пюре 100 г груша/яблоко) is 19
Levenstein distance from (фрутоняня пюре яблоко натур 100г n 1 - фрутоняня пюре яблочное 100.0) is 12
...
Рейтинг: 0 / 0
Нормализация строк
    #40104859
Ы2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, как это следует интерпретировать?

Вот другой пример:
Код: sql
1.
2.
3.
4.
select 
	similarity('фрутоняня пюре яблоко натур 100г n 1', 'натур пюре фрутоняня яблоко 100г n 1'),
	levenshtein('фрутоняня пюре яблоко натур 100г n 1', 'натур пюре фрутоняня яблоко 100г n 1')
;



similaritylevenshtein122
...
Рейтинг: 0 / 0
Нормализация строк
    #40104875
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ы2

Вот другой пример:
Код: sql
1.
2.
3.
4.
select 
	similarity('фрутоняня пюре яблоко натур 100г n 1', 'натур пюре фрутоняня яблоко 100г n 1'),
	levenshtein('фрутоняня пюре яблоко натур 100г n 1', 'натур пюре фрутоняня яблоко 100г n 1')
;



similaritylevenshtein122

Как я понимаю, функция levenshtein просто считает РЛ для переданных строк, это не совсем верный подсчет РЛ (в контексте топика): в случае, когда строка содержит несколько слов, нужно составить матрицу расстояний между словами, потом искать по ней порядок слов, при котором сумма РЛ будет минимальной, возможно, увеличивая результат при перестановке слов.
...
Рейтинг: 0 / 0
Нормализация строк
    #40104915
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. Левенштейн - редакционное расстояние между текстами. Я точно не помню
какая формула метрики - но кажется берется удаление + перенос символов + вставка.

В данном случае similarity сработал лучше (похоже на 1-й алгоритм который я предлагал выше) без учота перемещения лексем внутри sentence.

Кажется этого-же эффекта мы могли добиться сортируя слова в фильтрации.
...
Рейтинг: 0 / 0
Нормализация строк
    #40104955
Ы2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, РЛ = вставки + замены + удаления; обычно можно настраивать вклад каждой категории.

Все это время я пытался наглядно показать, что для нечеткого поиска N-граммы — триграммы как частный случай — всегда лучше расстояния Левенштейна. Само по себе РЛ неинформативно, пока не знаешь длины строки: РЛ = 2 между «рыба» и «глыба» (заведомо разные), между «заяц плюшевый большой» и «зайц плюшевый болшой» (неграмотность и опечатка), а так же между «ваш звонок очень важен для нас» и «наш звонок очень важен для вас» (тут и триграммы бессильны).
...
Рейтинг: 0 / 0
37 сообщений из 37, показаны все 2 страниц
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Нормализация строк
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]