Поиск по нескольким документам для общих слов
У меня есть текст песни. (.текст)
У меня также есть текст к 50 другим песням.
Я ищу способ проанализировать / найти эти 50 текстов песен с текстами первой песни и найти, какой из 50 наиболее похож на первый (на основе общих слов / словарного запаса).
Прошу прощения за выступление непрофессионала - это не моя область знаний (!)
Любая помощь или указатели будут высоко ценится
1 ответ
Вот мое решение, я предположил, что вас волнует только то, сколько слов совпадают, а не сколько раз они совпадают (например, "Ребенок" 5 раз в обеих песнях приносит в 5 раз больше очков).
Первый:
cat songname.txt | sed ':a;N;$!ba;s/\n/ /g' | tr -cd '[[:alnum:]]\ ' | sed 's#\ \ #\ #g' | sed 's#\ #\n#g' | sort | uniq -i > songnamewords.txt
Это превращает все новые строки в пробелы, удаляет все не алфавитно-цифровые символы (запятые), удаляет любые двойные пробелы, помещает каждое слово в отдельную строку, сортирует их и удаляет повторяющиеся строки.
Вы должны сделать это для всех песен, которые вы хотите сравнить, а затем:
cat songname1words.txt songname2words.txt | sort | uniq -d | wc -l
Это даст вам количество совпадений.
Я попробовал несколько примеров:
Животные Maroon 5 и Baby Джастина Бибера делятся 29 словами.
Maroon 5's Animals и Opeth's Grand Conjuration делятся 10 словами.
Это те результаты, которые вы ожидаете.
Кроме того, вот как вы можете сравнить его со всеми другими файлами песен:
a="songname1words.txt" && for f in *; do if [[ "$f" != "$a" ]]; then printf $(cat "$a" "$f" | sort | uniq -d | wc -l) && echo " - $f" | sort; fi; done
Где "songname1words.txt" - это имя файла, с которым вы хотите сравнить их все.
Это сравнивает все остальные текстовые файлы с этим, пропуская сравнение себя с самим собой, затем сортирует их по баллам, чтобы совпадение с номером 1 было наверху.
Это дает вывод, как это:
29 - bieberwords.txt
10 - opethwords.txt