Извлечь каноническую строку из списка шумных строк

10

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

Вот один из таких списков.

  • Звездные войны: Эпизод IV Новая Надежда | StarWars.com
  • Звёздные войны. Эпизод IV - Новая надежда (1977)
  • Звездные войны: Эпизод IV - Новая надежда - Гнилые помидоры
  • Наблюдайте за Звездными Войнами: Эпизод IV - Новая Надежда Онлайн Бесплатно
  • Звездные войны (1977) - Величайшие фильмы
  • [REC] 4 плаката обещают смерть от подвесного мотора - SciFiNow

Для этого списка любая строка, соответствующая регулярному выражению ^Star Wars:? Episode IV (- )?A New Hope$, будет приемлемой.

Я посмотрел курс Эндрю Нг по машинному обучению на Coursera, но мне не удалось найти подобную проблему.

лактон
источник
2
PS Я думаю, что вы ищете термин "канонический"
Шон Оуэн
Является ли «наиболее вероятная» / «наиболее согласованная» строка, которую вы ищете, идедификацией регулярного выражения? Или одна из строк в списке?
MrMeritology
@MrMeritology Я не ищу регулярное выражение. Я показал регулярное выражение в своем вопросе просто для иллюстрации того, насколько я гибок в том виде строк, которые я считаю правильными.
лактон
ХОРОШО. Тогда ответ, который я дал ниже, должен работать для вас.
MrMeritology
Подпадает ли это под NER (распознавание именованных объектов)?
Hippietrail

Ответы:

4

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

Во второй фразе я бы проголосовал большинством. Предполагая 3 предложения:

  • Звездные войны: Эпизод IV Новая Надежда | StarWars.com
  • Звёздные войны. Эпизод IV - Новая надежда (1977)
  • Звездные войны: Эпизод IV - Новая надежда - Гнилые помидоры

Я бы прошел через токены один за другим. Начнем со «Звезды». Он выигрывает, так как все строки начинаются с него. «Войны» тоже победят. Следующим является ":". Это также победит.

Все жетоны получат большинство голосов до "Надежды". Следующим токеном после «Надежда» будет либо «|», либо «(» или «-». Никто из победителей не победит в мажоритарном голосовании, поэтому я остановлюсь здесь!

Другое решение было бы, вероятно, использовать самую длинную общую подпоследовательность .

Как я уже сказал, я не особо об этом. Так что, может быть, есть гораздо лучшие решения вашей проблемы :-)

Пасмод Тьюринг
источник
3

Сначала вычислите расстояние редактирования между всеми парами строк. См. Http://en.wikipedia.org/wiki/Edit_distance и http://web.stanford.edu/class/cs124/lec/med.pdf . Затем исключите любые строки выбросов на основе некоторого порогового значения расстояния.

С остальными строками вы можете использовать матрицу расстояний для определения самой центральной строки. В зависимости от используемого вами метода вы можете получить неоднозначные результаты для некоторых данных. Ни один метод не подходит для всех возможностей. Для ваших целей все, что вам нужно, это некоторые эвристические правила для устранения неоднозначностей - то есть выбрать двух или более кандидатов.

Возможно, вы не хотите выбирать «самый центральный» из списка строк, но вместо этого хотите сгенерировать регулярное выражение, которое фиксирует шаблон, общий для всех строк, не являющихся выбросами. Один из способов сделать это - синтезировать строку, которая равноудалена от всех строк, не являющихся выбросами. Вы можете определить необходимое расстояние редактирования от матрицы, а затем случайным образом сгенерировать регулярные значения, используя эти расстояния в качестве ограничений. Затем вы протестируете регулярные выражения-кандидаты и примете первое, которое соответствует ограничениям, а также примет все строки в вашем списке не-выпадающих. (Начните создавать регулярные выражения из самых длинных общих списков подстрок, потому что это не подстановочные знаки.)

MrMeritology
источник