Procurando em vários documentos por palavras comuns

1

Eu tenho a letra de uma música. (.txt)

Eu também tenho letras de 50 outras músicas.

Estou procurando uma maneira de analisar / pesquisar essas 50 letras de músicas com as letras da primeira música e descobrir qual das 50 é mais semelhante à primeira (com base em palavras / vocabulário compartilhados).

Sinto muito pelo discurso de leigo - essa não é minha área de conhecimento (!)

Qualquer ajuda ou ponteiros seria muito apreciada

    
por ioloiol 22.10.2014 / 03:30

1 resposta

0

Aqui está minha solução, presumi que você só se importa com quantas palavras correspondem e quantas vezes elas coincidem (por exemplo, "Baby" 5 vezes em ambas as músicas vale 5x mais pontos).

Primeiro:

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

Isso transforma todas as novas linhas em espaços, remove todos os caracteres não alfanuméricos (Commas), remove quaisquer espaços duplos, coloca cada palavra em uma linha separada, classifica-os e remove linhas duplicadas.

Você precisa fazer isso para todas as músicas que deseja comparar e, em segundo lugar:

cat songname1words.txt songname2words.txt | sort | uniq -d | wc -l

Isso lhe dará um número de quantas palavras correspondidas.

Eu tentei alguns exemplos:

Animais do Maroon 5 e Bebê de Justin Bieber compartilham 29 palavras.

Animais do Maroon 5 e Grande Conjuração do Opeth compartilham 10 palavras.

Estes são os resultados esperados.

Além disso, veja como você pode compará-lo com todos os outros arquivos de letras:

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

Onde 'songname1words.txt' é o nome do arquivo com o qual você deseja compará-los.

Isso compara todos os outros arquivos de texto contra este, ignorando-se a si mesmo, depois classifica todos por pontuação, de modo que a correspondência do número 1 esteja no topo.

Ele gera uma saída assim:

29 - bieberwords.txt

10 - opethwords.txt

    
por 07.10.2015 / 10:39