2016-06-03 5 views
4

Backgound (упрощенный)Как найти общие части из 3 или более строк?

I've получил много файлов, где генерируется автоматически с помощью 3-й партии (думаю, выход из нескольких разных адреса сливает) и я пытаюсь программно восстановить оригинальные шаблоны и адрес/пользовательские данные из него.

Что I've посмотрел на до сих пор

Есть множество библиотек (jsdiff, difflib) для дифф двух файлов. I've нашел, что это полезно сделать так, чтобы выяснить% слов изменились - что является хорошим показателем, если два файла из одного шаблона

Вопрос

Итак, теперь I'm на стадии в том группироваться подобные текстовые файлы, теперь я бы в идеале найти способ Diff всех тех, отделяя одинаковый текст от различий:

Hello [Mr, Mrs] [NameA, NameB, NameC...], we are pleased to (...) 

Итак, как я могу найти общие части 3 или более строк в Javascript/Python?

+0

https://www.diffchecker.com или любой другой «diff» – dandavis

+0

@dandavis Является ли это рекламой/спамом? Двусторонний онлайн-инструмент сравнения не помогает ... – thomasf1

+1

@DomTomCat Я думаю, что ваш (удаленный) ответ можно прочитать как «Нет, нет, но вы можете использовать обертку и нестандартную дельта, чтобы сделать это с difflib. " Томас, это, наверное, лучший ответ, которого вы можете ожидать; иногда вещей еще нет. – Kittsil

ответ

2

Думаю, вам нужно дерево суффиксов (wikipedia). Создайте дерево суффиксов для каждого документа. Если вам не нужны отдельные персонажи, вы можете использовать слова вместо символов.

Как только у вас есть это, вам нужно найти самый длинный путь от корня, который найден во всех (или большинстве) отдельных деревьев суффикса. Так что просто выберите один, получите корень всех узлов и сделайте DFS, опустив ссылку, только если вы найдете ее во всех (или достаточно многих) деревьях. Это приведет к повторению всех подстрок, которые являются общими во всех документах.

Не уверен, что есть lib, который делает все это уже, но должно быть что-то уже, чтобы помочь вам построить дерево суффикса.

 Смежные вопросы

  • Нет связанных вопросов^_^