|
Нормализация строк
|
|||
---|---|---|---|
#18+
День добрый! Подскажите как определить что "Яблочное пюре" и "Пюре яблочное" в принципе одно и тоже, данные как пример, слова могут видо изменяться типа "Пюре из яблок". Заранее спасибо за советы! ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2021, 15:12 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
Встречный вопрос: "человек разумный" и "разумный человек" - это в принципе одно и то же или нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2021, 15:14 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
В данном случае можно разбить на слова и отсортировать по алфавиту, но это не всегда работает, есть исключения когда порядок слов играет роль. Сходу пример не придумаю, близкое: "копчено-вареный" и "варено-копченый" это два разных способа приготовления. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2021, 16:04 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
По хорошему надо какую-то классификацию слов вводить. Например в данном случае слово "пюре" это форма выпуска, "яблочное" это вкус. Для нормализации достаточно например идентифицировать форму выпуска и убрать в сторону как признак товара. Тогда сначала отдельно сравниваем форму, а если совпала, то остальное. Но в остальном тоже могут быть подставы типа "Пюре яблочное с корицей". ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2021, 16:09 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
Наверное, как-то так ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2021, 17:09 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
WebSharper Наверное, как-то так Нет, распознавание речи тут мало поможет. Оно заточено на разговорный язык. Наименования товаров далеки от обычного разговорного, это не связное предложение, а набор характеристик, причем многие написаны сокращенно. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2021, 20:00 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
Х-ха! Семантику по грамматике )) Меня однажды попробавали нагнуть автоматизацией поиска в инете. По названию товара неизвестно где выявить его цену)) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2021, 21:03 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
Mixon День добрый! Подскажите как определить что "Яблочное пюре" и "Пюре яблочное" в принципе одно и тоже, данные как пример, слова могут видо изменяться типа "Пюре из яблок". Заранее спасибо за советы! Мы находимся не в гуманитарном, а в техническом форуме. И поэтому задача должна быть поставлена технически. В противном случае - она просто переходит в область ЗПТ или дискуссий ВопросОтвет. Давайте перечислим алгоритмы нормализации строк Русского языка . Я делаю упор на Русский язык потому-то нормализация другого языка будет скорее всего совсем другим алгоритмом. Как "сумма прописью". Потом поищем готовые реализации этих алгоритмов. И потом поищем справочники слов или базы данных если таковые нужны. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2021, 16:06 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
Mixon Подскажите как определить что "Яблочное пюре" и "Пюре яблочное" в принципе одно и тоже, данные как пример, слова могут видо изменяться типа "Пюре из яблок". Заранее спасибо за советы! Необходимо ввести расстояние между названиями: когда решал подобную задачу для наименований алкоголя, использовал расстояние Левенштейна (РЛ) и "ручной подбор", т.е. оператор для каждого наименования видел отсортированный по РЛ список кандидатов, оттуда и выбирал, так строился справочник. Сейчас можно попробовать вместо РЛ использовать какой-нибудь Word2Vec и считать расстояние между векторами. Конкретная реализация, думаю, должна зависеть от предметной области: сколь автоматическим/точным должен быть подбор, сколько и каких строк нужно сравнивать (список названий или произвольные тексты). ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2021, 16:56 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
Mixon, можно попробовать использовать триграммное сходство. Например, его реализация в PostgreSQL считает, что «яблочное пюре» и «пюре яблочное» не различаются вовсе, а сходство любой из этих строк с «пюре из яблок» около 47%. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2021, 17:59 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
Ы2 Mixon, можно попробовать использовать триграммное сходство. Например, его реализация в PostgreSQL считает, что «яблочное пюре» и «пюре яблочное» не различаются вовсе, а сходство любой из этих строк с «пюре из яблок» около 47%. А "яблочная репа" будет ближе к "яблочному пюре" нежели чем "пюре из яблок". Вот такой метафизический парадокс. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2021, 18:36 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
mayton Давайте перечислим алгоритмы нормализации строк Русского языка . И что ты там собрался нормализовывать? Выделять подлежащее, сказуемое и т.д. и т.п.? В наименовании товара ничего этого нет, это просто перечисление разных характеристик, причем некоторые остаются неупомянуты, т.к. существуют в одном экземпляре. Штрихкод легко решает все проблемы на 99% ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2021, 21:40 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
Ы2 Mixon, можно попробовать использовать триграммное сходство. Например, его реализация в PostgreSQL считает, что «яблочное пюре» и «пюре яблочное» не различаются вовсе, а сходство любой из этих строк с «пюре из яблок» около 47%. Жёлтый и белый тоже очень похожи по написанию ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2021, 21:51 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
Штрихкод - это не тема топика вроде как. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2021, 12:51 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
Точно также поступил, когда нормализовывал улицы, писанные вразнобой. x1ca4064 Необходимо ввести расстояние между названиями ... "ручной подбор" ... должна зависеть от предметной области Ещё подвох - омонимы и какая-никакая контекстная зависимость. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2021, 15:18 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
mayton Штрихкод - это не тема топика вроде как. Я так понимаю ТС хочет находить одинаковые товары по разному написанные. Большинство товаров нынче имеют штрихкод. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2021, 15:26 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
Dima T Ы2 Mixon, можно попробовать использовать триграммное сходство. Например, его реализация в PostgreSQL считает, что «яблочное пюре» и «пюре яблочное» не различаются вовсе, а сходство любой из этих строк с «пюре из яблок» около 47%. Жёлтый и белый тоже очень похожи по написанию Это вам только кажется. У них триграммное сходство 8,3%. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2021, 16:17 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
Dima T mayton Штрихкод - это не тема топика вроде как. Я так понимаю ТС хочет находить одинаковые товары по разному написанные. Большинство товаров нынче имеют штрихкод. Вернемся к яблокам. Для данного частного случая: Код: java 1.
Я-бы предложил следующее. Триграммный поиск - не вариант т.к. тут не опечатка а морфологическое преобразование. Нам нужно все слова и выражения свести к единой основе. Код: sql 1.
и обеспечить правильный порядок. Можно задать ранг слов или положить их в SortedSet. По триграммам. Про близость "пюре" и репа я уже писал. Надо практически посмотреть и взять хотя-бы штук 100-200 реальных названий и прогнать их по тесту. Короче сложность решения задачи сильно зависит от качества самих исходных данных. Триграммы и биграммы и прочие N-граммы это - слишком простой подход. Он может даже и не на текст ориентирован на например на генетику (биологию) и он может хорошо работать в одних случаях, а в случаях с мофологией и лемматизацией он может просто давать очень плохие результаты. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2021, 17:44 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
Ы2 Dima T пропущено... Жёлтый и белый тоже очень похожи по написанию Это вам только кажется. У них триграммное сходство 8,3%. Триграмное да, а левенштейн очень близок, выделил совпадающие буквы: ЖЕЛТЫЙ БЕЛЫЙ ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2021, 21:51 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
mayton, близость «пюре» и «репа» — еще более мнимая, чем «желтый» и «белый»: триграммное сходство 0%, РЛ = 4 и равно длине слова. «яблочная репа» дальше от «яблочное пюре» (27%), чем «пюре из яблок» (47%). Вы ошибочно полагаете, что триграммное сходство — для поиска опечаток. Оно для поиска строк, совпадающих по большей части . Для опечаток — расстояние Левенштейна. Поэтому, на мой взгляд, самое простое решение — сформировать по триграммам список кандидатов на отождествление и отдать оператору, пусть решает вручную. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2021, 22:48 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
Если решать в лоб, то можно 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-граммы позволяют превращать слова в векторы, но(!) таким образом, что близкие по смыслу слова имеют близкие векторы. Это позволяет делать вещи типа семантических калькуляторов, поиска аналогий, поиска похожих вещей и т.п. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2021, 04:59 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
Погуглил немного, вот реальные наименования из предложений в инете: Код: sql 1. 2. 3.
А есть еще такие: Код: sql 1. 2.
Можно еще поискать ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2021, 07:32 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
Dima T Погуглил немного, вот реальные наименования из предложений в инете: Код: sql 1. 2. 3.
А есть еще такие: Код: sql 1. 2.
Можно еще поискать Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
вариант 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 Не идеально, конечно, но можно начинать что-то городить вокруг этого. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2021, 09:41 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
Ы2 но можно начинать что-то городить вокруг этого Тут ещё непонятен вопрос. Нужно сравнивать все строки со всеми, тогда это задача кластеризации. Либо всё-таки есть словарь правильных, нормализованных строк, и нужно сравнивать новые строки со словарем. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2021, 10:02 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
Ы2 Код: sql 1.
Чтобы не двоилось лучше так Код: sql 1.
Ы2 Не идеально, конечно, но можно начинать что-то городить вокруг этого. ИМХО, как выше написали, начинать надо с выделения характеристик: брэнд, тип, вкус, вес и т.д. а дальше нераспознанное можно этим способом досравнивать. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2021, 10:29 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
Вот этот суффикс типа Код: sql 1.
тоже может сильно изменить формулу дистанции. Могут быть ложные срабатывания для других товаров. Кстати этот similarity(..) какой алгоритм использует? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2021, 10:31 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
Dima T Погуглил немного, вот реальные наименования из предложений в инете: А есть еще такие: Можно еще поискать ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2021, 12:31 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
exp98 Dima T Погуглил немного, вот реальные наименования из предложений в инете: А есть еще такие: Можно еще поискать Что первое гугл выдал, то и скопипастил. Хорошо в рекламу вкладываются видать. Так что наше упоминание им продажи не увеличит. А в остальном этот бренд гадость редкостная, когда дети маленькие были жена говорила не брать его ни при каком раскладе ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2021, 12:45 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
mayton Могут быть ложные срабатывания для других товаров. У нас в Перекрёстки с недавних лет помидоров не стало, их постепенно вытеснили томаты. А так хочется помидорчиков! А что в других регионах? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2021, 13:02 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
mayton Вот этот суффикс типа Код: sql 1.
Не знаю новейших практик. М.б. подобное уже зашивают в классификациютоварных групп? Например одежда изначально классифицировалась матрично: цвето-размер. Прикол по случаю В маге на стенке есть считыватели штрих-кода, чтоб мы сами цену узнавали. Иногда они зависают. Раз я взял и перезапустил девайс, а там загрузился маленький Виндовс. Не помню, то ли через "Пуск" загрузил прогу, или не удалось... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2021, 13:07 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
exp98, Можно тут найти похожие слова для "помидор" https://rusvectores.org/ авторогурец 0.775 морковь 0.726 овощ 0.711 баклажан 0.706 капуста 0.704 арбуз 0.701 салат 0.690 чеснок 0.687 томат 0.684 фасоль 0.670 Помидор больше похож на огурец, чем на томат. На этот случай наверное нужен свой словарь синонимов ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2021, 13:14 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
mayton Вот этот суффикс типа Код: sql 1.
тоже может сильно изменить формулу дистанции. Могут быть ложные срабатывания для других товаров. Кстати этот similarity(..) какой алгоритм использует? Это функция из расширения pg_trgm для PostgreSQL. Разбирает строки на буквенные триграммы и считает долю общих. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2021, 13:39 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
Код: 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.
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2021, 19:50 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
mayton, как это следует интерпретировать? Вот другой пример: Код: sql 1. 2. 3. 4.
similaritylevenshtein122 ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2021, 00:09 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
Ы2 Вот другой пример: Код: sql 1. 2. 3. 4.
similaritylevenshtein122 Как я понимаю, функция levenshtein просто считает РЛ для переданных строк, это не совсем верный подсчет РЛ (в контексте топика): в случае, когда строка содержит несколько слов, нужно составить матрицу расстояний между словами, потом искать по ней порядок слов, при котором сумма РЛ будет минимальной, возможно, увеличивая результат при перестановке слов. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2021, 04:15 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
Да. Левенштейн - редакционное расстояние между текстами. Я точно не помню какая формула метрики - но кажется берется удаление + перенос символов + вставка. В данном случае similarity сработал лучше (похоже на 1-й алгоритм который я предлагал выше) без учота перемещения лексем внутри sentence. Кажется этого-же эффекта мы могли добиться сортируя слова в фильтрации. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2021, 12:18 |
|
Нормализация строк
|
|||
---|---|---|---|
#18+
mayton, РЛ = вставки + замены + удаления; обычно можно настраивать вклад каждой категории. Все это время я пытался наглядно показать, что для нечеткого поиска N-граммы — триграммы как частный случай — всегда лучше расстояния Левенштейна. Само по себе РЛ неинформативно, пока не знаешь длины строки: РЛ = 2 между «рыба» и «глыба» (заведомо разные), между «заяц плюшевый большой» и «зайц плюшевый болшой» (неграмотность и опечатка), а так же между «ваш звонок очень важен для нас» и «наш звонок очень важен для вас» (тут и триграммы бессильны). ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2021, 18:39 |
|
|
start [/forum/topic.php?all=1&fid=16&tid=1339623]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
169ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
others: | 236ms |
total: | 514ms |
0 / 0 |