Как найти подходящую строку для строки из одного текстового файла в другом текстовом файле?
У меня есть два текстовых файла. Оба они имеют одинаковое содержание, но форматирование каждого отличается. В одном файле есть лишние пробелы между словами или буквами. Также есть разные разрывы строк. Например:
File1:
The annotation framework we presented is
embedded in the Knowledge Management and
Acquisition Platform Semantic Turkey (Pazienza, et
al., 2012), and comes out-the-box with a few
annotation families which differ in the underlying
annotation model and, notably, in the tasks they
support. The default handlers take into consideration
the annotation of atomic ontological resources, and
complex activities that are provided as macros, e.g.
the creation of new instances, the definition of new
subclasses in OWL, or of narrower concepts in
SKOS.
File2:
Theannotationframework we presented is
embedded in th e K n o w l e d ge Management and
Acquisition Platform Semantic Turkey (Pazienza, et
al., 2012), and comes out-the-
box with a few
annotation families which differ in the underlying
annotation model and, notably, in the tasks they
support. The default handlers take into consideration
the a n n o t a t i o n o f a t o m i c ontological resources, and
complex activities that are provided as macros, e.g.
the creation of new instances, the definition of new
subclasses in OWL, or of narrower concepts in
SKOS.
Предположим, я выбрал строку the Knowledge Management
из File1, и я хочу сопоставить его со строкой th e K n o w l e d ge Management
в файле2.
Как мне этого добиться? Во втором файле нет фиксированных деформаций. Единственная гарантия состоит в том, что символы находятся в одном и том же порядке в обоих файлах, и они могут быть разделены лишними пробелами, или пробел между ними может отсутствовать.
Я думал о применении алгоритма Селлерса или алгоритма Витерби, но я не уверен в этом. Приблизительное сопоставление строк также может быть дорогим.
Любое руководство будет полезно. Большое спасибо!
2 ответа
Вы должны понимать, что у вас нет двух текстов, но практически один, со всеми персонажами в одной позиции!
По какой магии? Что ж, достаточно убрать все пробелы и разделители или, что лучше, пропустить их, когда вы переходите от одного символа к другому.
Вы можете легко обойти оба текста параллельно, оставаясь синхронизированными, и поиск не требуется!
Например, обаthe Knowledge Management
" а также "th e K n o w l e d ge Management
"бегите с позиции 45 на 67.
Если вы не знаете начальную позицию строки поиска в первом тексте, затем выполните обычный поиск по первому тексту (с пробелами или без них, на ваше усмотрение) и переместите второй текст в ту же позицию.
The annotation framework we presented is
0 1 2 3
0122345678901223467890122344567890123345
Если вам нужно выполнить множество строк в тексте, обход с начала каждый раз становится дорогостоящим. Затем вы можете использовать индексную таблицу, которая связывает местоположение без пробелов с обычным местоположением, и выполнять бинарный поиск при необходимости.
Вы можете импортировать файлы в виде строк и удалить все пробелы из обоих. Тогда это должно быть прямое совпадение строк.
Если вам также нужен начальный индекс соответствующего шаблона, получите индекс начальной точки в свернутой строке и запустите цикл for для разнесенной версии, считая только символы.