powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Нормализация строк
25 сообщений из 37, страница 1 из 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
25 сообщений из 37, страница 1 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Нормализация строк
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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