1

Я пытаюсь сравнить два текстовых файла документов (40 страниц +), которые, кажется, имеют похожие предложения разбросаны вокруг них. Я хотел бы обнаружить эти сходства как-то. Первой идеей, которая пришла мне в голову, было поиск любых трех последовательных слов, которые существуют в обоих файлах (без учета регистра). К сожалению, я не мастер Linux. Есть какой-нибудь сценарий, который бы идентифицировал их для меня?

1 ответ1

1

Как извлечь три слова подряд для каждого предложения:

Предположим, эти два файла называются file1.txt и file2.txt . Конвертируйте каждый конец строки в пробел, используя tr , затем извлекайте строки с тремя последовательными словами в каждом, используя sgrep (вам, вероятно, потребуется установить это, многие дистрибутивы предлагают его в виде пакета):

cat file1.txt | tr '[\n]' ' ' | sgrep -o '%r\n' '" "_." ".." "._" "' > file1.words
cat file2.txt | tr '[\n]' ' ' | sgrep -o '%r\n' '" "_." ".." "._" "' > file2.words

Обязательно вставляйте пробел или символ новой строки перед первым и последним словом в file1.txt или file2.txt , иначе он не будет работать для первого соотв. последние три слова. Это сохраняет пунктуацию и делает ее частью слова, вы можете избавиться от пунктуации, вставив дополнительный

... | tr -d '[,.;:()]' | ...

после первого tr (символ | строит "каналы" между командами, поэтому следующая команда использует вывод предыдущей).

Далее найдите повторения трех слов:

sort file1.words file2.words | uniq -d

Это распечатает любой набор из трех слов, который встречается несколько раз, будь то в одном файле или в file1.txt и file2.txt . Вам нужно будет вручную проверять каждый случай (используя поиск в текстовом редакторе), чтобы выяснить, какой, но вы все равно захотите сделать это, чтобы оценить сходство.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .