1

У меня есть текст песни. (.текст)

У меня также есть текст к 50 другим песням.

Я ищу способ проанализировать / найти эти 50 текстов песен с текстами первой песни и найти, какой из 50 наиболее похож на первый (на основе общих слов / словарного запаса).

Прошу прощения за выступление непрофессионала - это не моя область знаний (!)

Любая помощь или указатели будут высоко ценится

1 ответ1

0

Вот мое решение, я предположил, что вас волнует только то, сколько слов совпадает, а сколько раз они совпадают (например, «Ребенок» 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

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