Есть ли приложение для поиска похожих документов?

Есть ли приложение для поиска похожих документов?

Есть ли хорошее программное обеспечение, которое находит группы из нескольких похожих файлов или файлы, в которых один файл включает часть другого?

У меня есть каталог с множеством перепутанных файлов. Среди файлов есть разные версии файлов, и имена файлов перепутаны.

решение1

Что насчет использования diff для сравнения двух файлов, подсчета строк дифференцированного текста с помощью 'wc -l', а затем подсчета фактических строк в обоих сравниваемых файлах. Если строки diff значительно меньше фактических строк файлов, то можно с уверенностью сказать, что файлы скорее похожи, чем нет. Это начало, по крайней мере.

Вот идея того, что вы будете делать.ПРИМЕЧАНИЕ:это предполагает, что вы имеете дело с недвоичными файлами

Сначала необходимо получить количество строк в каждом файле:

$ cat <file1> | wc -l
24
$ cat <file2> | wc -l
18
$ cat <file3> | wc -l
25
$ cat <file4> | wc -l
4

Затем пройдитесь по каталогу, сравнивая файлы с помощью «diff» и подсчитывая различия в строках:

$ diff <file1> <file2> | wc -l 
47
$ diff -ib <file1> <file3>  | wc -l
12
$ diff -ib <file1> <file4>  | wc -l
34

Это основная идея.

Скрипт ниже сделает это за вас (работает в текущем каталоге) и будет выводить каждый раз, когда разница меньше количества строк в любом из файлов. Вы можете изменить это, чтобы быть более осторожным, находя только совпадения для количества строк разницы, которые более чем на 10+ меньше количества строк в любом из файлов.

for i in `ls`; do 
  for f in `ls`; do 
    if [ $i != $f ]; then 
      F_LINES=`cat $f | wc -l`; 
      I_LINES=`cat $i | wc -l`; 
      DIFF=`diff -ib $i $f | wc -l`;
      if [ $I_LINES -ge $DIFF ]; then 
        if [ $F_LINES -ge $DIFF ]; then 
          echo "SIMILAR: $i [lines: $I_LINES] - $f [lines: $F_LINES] - # lines different: $DIFF";
        fi;
      fi;
    fi;
  done; 
done

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

SIMILAR: <file1> [lines: 24] - <file3> [lines: 25] - # lines different: 12
SIMILAR: <file3> [lines: 25] - <file1> [lines: 24] - # lines different: 12

Связанный контент