Витягніть канонічну струну зі списку галасливих струн


10

У мене тисячі списків рядків, і кожен список містить близько 10 рядків. Більшість рядків у даному списку дуже схожі, хоча деякі рядки (рідко) повністю не пов'язані з іншими, а деякі рядки містять нерелевантні слова. Їх можна вважати галасливими варіаціями канонічної струни. Я шукаю алгоритм чи бібліотеку, які перетворять кожен список у цю канонічну рядок.

Ось один такий список.

  • Зоряні війни: Епізод IV Нова надія | StarWars.com
  • Зоряні війни - Епізод IV - Нова надія (1977)
  • Зоряні війни: Епізод IV - Нова надія - гнилі помідори
  • Дивитися Зоряні війни: Епізод IV - Нова надія в Інтернеті безкоштовно
  • Зоряні війни (1977) - Найбільші фільми
  • [REC] 4 плакат обіцяє смерть позамоторному мотору - SciFiNow

У цьому списку ^Star Wars:? Episode IV (- )?A New Hope$прийнятна будь-яка рядок, що відповідає регулярному виразу .

Я переглянув курс Ендрю Нґ з машинного навчання на курсі, але не зміг знайти подібну проблему.


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 . Потім виключіть будь-які рядки, що випадають, на основі деякого порогу відстані.

За допомогою решти рядків ви можете використовувати матрицю відстані, щоб визначити найбільш центральну рядок. Залежно від методу, який ви використовуєте, ви можете отримати неоднозначні результати для деяких даних. Жоден метод не ідеальний для всіх можливостей. Для ваших цілей все, що вам потрібно, - це деякі евристичні правила для вирішення неоднозначностей, тобто вибір двох або більше кандидатів.

Можливо, ви не хочете вибирати "найголовніше" зі свого списку рядків, але натомість хочете генерувати регулярний вираз, який фіксує шаблон, спільний для всіх рядків, що не є сторонніми. Один із способів зробити це - синтезувати рядок, що знаходиться на відстані однаково від усіх рядків, що не є сторонніми. Ви можете відпрацювати необхідну відстань для редагування від матриці, а потім випадково генерувати регулярні, використовуючи ці відстані як обмеження. Тоді ви протестуєте регулярні вирази кандидата та приймете перший, який відповідає обмеженням, а також приймає всі рядки у вашому списку, що не виходить. (Почніть створювати регулярні вирази з найдовших загальних списків підрядків, оскільки це символи, що не мають підстановки.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.