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