Подтвердить что ты не робот

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

Я работаю с API, который сопоставляет мои запросы GTIN/EAN с данными о продуктах.

Поскольку возвращаемые данные происходят из кормов товарных продуктов, следующее почти повсеместно:

  • Несколько результатов в GTIN
  • Названия продуктов в значительной степени неструктурированы.
  • Названия продуктов "загрязнены"
    • Связанный с SEO материал,
    • информация о количестве, содержащемся,
    • "купить два, получить один бесплатный" предложения,
    • и др.

Я ищу программный способ

  • выберите "самую чистую" /самую доступную каноническую версию
  • или создать новый, который представляет "самый низкий общий знаменатель".

Рассмотрим следующий пример для одного запроса EAN:

  • Nivea Deo Roll-On Dry Impact для мужчин
  • NIVEA DEO Roll on Dry/blau
  • Nivea Deo Roll-On Dry Impact для мужчин, 50 мл, 3er Pack (3 x 50 мл).
  • Nivea Deo Roll on Dry/blau 50 ml
  • Nivea Deoroller 50 мл сухой для мужчин blau Mindestabnahme: 6 Stück (1 VE)
  • NIVEA Deoroller, сухое воздействие для мужчин
  • NIVEA DEO Roll on Dry/blau_50 ml

Мой подход домохозяйства выглядит следующим образом:

  • Основная очистка:
    • Опишите заголовки,
    • удалить лишние пробелы,
    • выбросить очевидные временные слова, такие как "купить" и "click"
  • Создайте массив для word => global occurence
    • "Nivea" => 7
    • "Deo" => 5
    • "Deoroller" => 2
    • "VE" => 1
  • Рассчитайте "совокупное значение слова" для каждого из названий
    • "Nivea Deo" => 12
    • "Nivea Deoroller VE" => 10
  • Разделите кумулятивное значение по длине заголовка, в результате получив оценку
    • "Nivea Deo" => 6
    • "Nivea Deoroller VE" => 3.34

Очевидно, что мой подход является довольно простым, подверженным ошибкам и предвзятым отношением к коротким предложениям с часто используемыми словами - дает более или менее удовлетворительные результаты.

  • Вы бы выбрали другой подход?
  • Есть ли какой-нибудь магический способ NLP для решения проблемы, о которой я не знаю?
4b9b3361

Ответ 1

Поскольку ваша существующая метрика, похоже, смещается в сторону более коротких фраз, вы должны учитывать факторинг в битрамах в микс. Поэтому вместо того, чтобы рассматривать оценки только для отдельных слов, дополнительно учитывайте оценку для последовательных пар слов (например, "nivea deo", deo roll-on "," roll-on dry "и т.д.). Когда вы вычисляете баллы для каждого заглавия, учитывайте количество баллов для каждой униграммы и биграма, вы можете генерировать из названия вместе, но, возможно, придать бетарам больше веса, и это должно побудить ваш алгоритм предпочесть более длинные фразы.

Если у вас есть большой существующий массив из множества имен, подобных этим в вашем распоряжении, подумайте над тем, чтобы использовать что-то вроде TF-IDF
То, что вы делаете правильно, можно сравнить с использованием TF. Используя ваш глобальный корпус, вы можете вычислить idf каждой униграммы и bigram, что в основном является мерилом уникального или редкого слова или фразы по всему корпусу.
tf = количество раз, когда вы видели ngram в этих результатах
idf = глобальная мера того, насколько уникальной может быть ngram для всех результатов (или, по крайней мере, их очень много)
Поэтому, вычисляя балл для названия, вместо простого добавления tf каждой nграммы в нем вы добавляете tf * idf для каждой nграммы. Более редкие ngrams (которые, возможно, лучше выполняют выделение этого элемента из всех других элементов) имеют более высокий idf, поэтому ваш алгоритм должен давать им больший вес. Много мусорных терминов (например, Mindestabnahme) имели бы действительно высокий idf, но у них было бы очень маленькое tf, так что они могли бы не иметь большого значения. Альтернативно вырезать токены, которые вы видите меньше, чем в k раз, чтобы избавиться от шума.

Еще один трюк NLP, о котором нужно знать, - это расстояние Левенштейна.., что является способом количественной оценки того, как подобны две строки. Вы можете вычислить расстояние levenshtein между каждой парой строк в ваших результатах, а затем попробуйте предпочесть результат, который имеет самое низкое среднее расстояние от всех остальных строк. Это может не сработать само по себе... но факторинг этой оценки с помощью вашего существующего подхода может помочь вам ориентироваться в некоторых сложных случаях.

Ответ 2

я бы:

  • Преобразование всех строк в нижний (или верхний) регистр
  • Выполните выравнивание нескольких последовательностей по всем строкам
  • Преобразование обратно в исходный файл
  • Найти наиболее частое письмо в каждом столбце
  • Удалите пробелы

В вашем примере:

  • Преобразование всех строк в нижний (или верхний) регистр

    nivea deo roll-on dry impact for men
    nivea deo roll on dry/blau
    nivea deo roll-on dry impact for men, 50 ml, 3er pack (3 x 50 ml)
    nivea deo roll on dry/blau 50 ml
    nivea deoroller 50ml dry for men blau mindestabnahme: 6 stück (1 ve)
    nivea deoroller, dry impact for men
    nivea deo roll on dry/blau_50 ml
    
  • Выполните выравнивание нескольких последовательностей по всем строкам

    nivea deo roll°°-on °°dry °°°°°°°°°°impact for men°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
    nivea deo roll°° on °°dry/blau°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
    nivea deo roll°°-on °°dry °°°°°°°°°°impact for men, 50 ml, 3er pack (3 x 50 ml)°°°°°°°
    nivea deo roll°° on °°dry/blau °°°°°°°°°°°°°°°°°°°°°50 ml°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
    nivea deo°roller 50ml dry °°°°°°°°°°°°°°°°°for men blau mindestabnahme: 6 stück (1 ve)
    nivea deo°roller, °°°°dry °°°°°°°°°°impact for men°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
    nivea deo roll°° on °°dry/blau_50 ml°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
    

    (где ° обозначает знак пробела)

  • Преобразуйте обратно в исходный код

    nivea deo roll°°-on °°dry °°°°°°°°°°impact for men°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
    nivea deo roll°° on °°dry/blau°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
    nivea deo roll°°-on °°dry °°°°°°°°°°impact for men, 50 ml, 3er pack (3 x 50 ml)°°°°°°°
    nivea deo roll°° on °°dry/blau °°°°°°°°°°°°°°°°°°°°°50 ml°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
    nivea deo°roller 50ml dry °°°°°°°°°°°°°°°°°for men blau mindestabnahme: 6 stück (1 ve)
    nivea deo°roller, °°°°dry °°°°°°°°°°impact for men°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
    nivea deo roll°° on °°dry/blau_50 ml°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
    
  • Найдите наиболее частое письмо в каждом столбце

    Nivea Deo Roll°° on °°Dry °°°°°°°°°°°°°°°°°for Men°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
    
  • Удалите пробелы

    Nivea Deo Roll on Dry for Men
    

Все, кроме шага 2 (выравнивание нескольких последовательностей), является простым. Многократное выравнивание последовательностей обычно используется в биоинформатике, см., Например. здесь или здесь или здесь... Конечно, вы можете найти код C или Java, но я не уверен в PHP.

Update:

Чтобы начать работу с множественного выравнивания, так называемое "выравнивание по звездам" представляет собой комбинацию парных выравниваний одной последовательности ( "звездный центр" ) со всеми остальными. Парное выравнивание обычно вычисляется с использованием динамического программирования, см., Например, здесь или здесь. Чтобы создать множественное выравнивание, вы выбираете одну из своих строк, чтобы быть центром звезды. Вы находите попарные выравнивания между ним и каждой другой строкой, а затем выравниваете попарные выравнивания, внося в них промежутки, чтобы звезды центрировались во всех выравниваниях, полностью выровнены. Вы можете повторить процедуру, используя результат предыдущего шага как центр звезды для следующего, пока он не сходится, т.е. Результат не изменяется.

Обновление 2: Вы можете также использовать целые слова в качестве символов (quants, атомов) для выравнивания. Скажем, A = nivea, B = deo и т.д. Это имеет следующие преимущества:

  • Слова не могут быть изменены выравниванием и обрабатываются одинаково, независимо от их длины.
  • При совместном выравнивании вы можете назначить затраты на замену отдельных слов ( "символов" ) в соответствии с TF-IDF и их синонимами. Паралельное выравнивание пытается минимизировать (взвешенное) расстояние Левенштейна между последовательностями.

В вашем примере (попробуйте сами) это приведет к

Nivea Deo Roll on Dry for Men 50 ml

то есть. мы также получаем 50 ml. Это связано с тем, что пропускание двухбуквенных слов не дешевле, чем пропускание 20-буквенных слов.

Ответ 3

Если я правильно понял, вы не сопоставляете эти имена с существующей базой данных, но пытаетесь как можно ближе подойти к фактическому названию продукта, так что вот моя идея:

  • Не выполняйте обычную очистку - просто удалите лишние пробелы - оставите слова остановки, случай символа, разделители (например, дефис) неповрежденными.
  • Разделить строки на строки в пробеле.
  • Разделите термины на разделителях, число / char, символьный регистр, но не удаляйте оригиналы, просто добавьте дополнительные сразу после расщепленного термина, выполните строчные буквы всех терминов, удалите повторяющиеся и пустые слова
  • Удалить термины, которые не являются общими для фиксированных% строк (если это будет 40 или 95%, которые вы узнаете после тестирования) - это приведет к удалению большинства, если не всех, добавленных продавцами.
  • Найти наиболее распространенное положение для каждого термина.
  • Если вы получаете более одного термина с той же самой общей проверкой позиции, которая чаще всего встречается перед другой. Увеличьте "более слабую" позицию на 1, повторите, пока не будет конфликта.
  • Для каждого оставшегося слова выберите наиболее часто используемую капитализацию
  • Объединить оставшиеся условия

Используя ваш пример, он будет работать следующим образом:

Шаг 1:

Nivea Deo Roll-On Dry Impact для мужчин

NIVEA DEO Roll on Dry/blau

Nivea Deo Roll-On Dry Impact для мужчин, 50 мл, 3er Pack (3 x 50 мл)

Nivea Deo Roll on Dry/blau 50 мл

Nivea Deoroller 50 мл сухой для мужчин blau Mindestabnahme: 6 Stück (1 VE)

NIVEA Deoroller, сухое воздействие на мужчин

NIVEA DEO Roll на сухом /blau _50 мл

Шаг 2:

Nivea, Deo, Roll-On, Dry, Impact, for, Men

NIVEA, DEO, Roll, on, Dry/blau

Nivea, Deo, Roll-On, Dry, Impact, for, Men, 50, ml, 3er, Pack, (3, x, 50, ml)

Nivea, Deo, Roll, on, Dry/blau, 50, ml

Nivea, Deoroller, 50ml, dry, for, Men, blau, Mindestabnahme:, 6, Stück, (1, VE)

NIVEA, Deoroller, Dry, Impact, for, Men

NIVEA, DEO, Roll, on, Dry/blau_50, ml

Шаг 3:

nivea, deo, roll-on, roll, on, dry, impact, for, men

nivea, deo, roll, on, dry/blau, dry, blau

nivea, deo, roll-on, roll, on, dry, impact, for, men, 50, ml, 3er, pack, 3, x, 50, ml

nivea, deo, roll, on, dry, blau, 50, ml

nivea, deoroller, 50 мл, 50, мл, сухой, для мужчин, blau, mindestabnahme, 6, stück, 1, ve

nivea, deoroller, dry, impact, for, men

nivea, deo, roll, on, dry/blau, dry, blau, 50, ml

Шаг 4: (предполагая порог 60%)

nivea, deo, roll, on, dry, for, men

nivea, deo, roll, on, dry, blau

nivea, deo, roll, on, dry, for, men, 50, ml

nivea, deo, roll, on, dry, 50, ml

nivea, 50, мл, сухой, для мужчин, blau

nivea, сухой, для мужчин

nivea, deo, roll, on, dry, blau, 50, ml

Шаг 5:

nivea = > 1

deo = > 2

roll = > 3

on = > 4

dry = > 5

for = > 6

men = > 7

blau = > 6

50 = > 8, 6, 2, 7

ml = > 8, 7, 3, 8

Шаг 6:

nivea = > 1

deo = > 2

roll = > 3

on = > 4

dry = > 5

blau = > 6

for = > 7

men = > 8

50 = > 9

ml = > 10

Шаг 7

Nivea, Deo, Roll, on, Dry, blau for, Men, 50, ml

Шаг 8

конечный результат: Nivea Deo Roll on Dry blau для мужчин 50 мл

Этот метод имеет следующие проблемы:

  • Он не обрабатывает имена с повторяющимися терминами хорошо (или вообще - все временные вхождения после 1-го утраты)
  • Он предвзято разделять разделенные разделенными или разделенными по частям (ProductName) части имени в разделенные пробелы - это можно устранить, если вы проверите наиболее распространенную версию на шаге 8.

Ответ 4

У вас очень хорошая проблема с NLP. Я работал примерно один год назад. Я также рекомендовал бы подход adi92. Но если вам нужно использовать какое-либо программное обеспечение NLP, я предлагаю Stanford NLP. Здесь также представлены программное обеспечение и соответствующие публикации. http://nlp.stanford.edu/ Надеюсь, это поможет.