Wyszukiwanie wielu dokumentów w poszukiwaniu typowych słów

1

Mam tekst piosenki. (.tekst)

Mam też teksty do 50 innych piosenek.

Szukam sposobu na przeanalizowanie / przeszukanie tych 50 tekstów piosenek z tekstami do pierwszej piosenki i stwierdzenie, który z 50 jest najbardziej podobny do pierwszego (na podstawie wspólnych słów / słownictwa).

Przepraszam za wypowiedzi laika - to nie jest moja dziedzina wiedzy (!)

Każda pomoc lub wskazówki byłyby mile widziane

ioloiol
źródło
Pomogłoby to uzyskać pewne dane wejściowe i żądane wyjście.
fedorqui
Weź teksty do pierwszej 50 listy Billboardu. Jeśli wziąłeś aktualny numer Billboardu 1 i przeszukałeś jego teksty przeciwko 50 innym utworom, wynik, który mógłbyś uzyskać, byłby: SORTOWANY PRZEZ NAJBARDZIEJ PODOBNE 1) "MAROON 5 - ZWIERZĘTA", wspólne słowa = kłopoty, kapelusz, płaszcz, ja, ktoś, pomoc, ciasto itp. 2) „ARTYSTA - NAZWA PIOSENKI”, dzielone słowa = ładne, nigdy, tylko, pomoc, itd. 3) „ARTYSTA - PIOSENKA”, współdzielone: ​​x, x , x, x. Idealnym wyjściem byłoby 50 tekstów piosenek posortowanych według „podobieństwa”, z podświetlonymi wspólnymi słowami. Mam nadzieję, że to pomoże, pracuję w wideo - skomplikowane wyszukiwanie jest poza moją strefą komfortu! Twoje zdrowie
ioloiol
Jeden problem polega na tym, że potrzebowałbyś listy słów do zignorowania, takich jak „The” i „la la la” itd.
Jack

Odpowiedzi:

0

Oto moje rozwiązanie. Przypuszczałem, że zależy ci tylko na tym, ile słów pasuje raczej do tego, ile razy pasują (np. „Baby” 5 razy w obu utworach jest warte 5 razy więcej punktów).

Pierwszy:

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

To zamienia wszystkie znaki nowej linii w spacje, usuwa wszystkie znaki niealfanumeryczne (przecinki), usuwa wszelkie podwójne spacje, umieszcza każde słowo w oddzielnej linii, sortuje je i usuwa duplikaty linii.

Musisz to zrobić dla wszystkich utworów, które chcesz porównać, a następnie:

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

To da ci liczbę dopasowanych słów.

Próbowałem kilku przykładów:

Maroon 5's Animals i Justin Bieber's Baby dzielą 29 słów.

Maroon 5's Animals i Opeth's Grand Conjuration dzielą 10 słów.

Takie są oczekiwane wyniki.

Również tutaj możesz porównać to z innymi plikami tekstowymi:

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

Gdzie „songname1words.txt” to nazwa pliku, z którym chcesz je porównać.

To porównuje wszystkie inne pliki tekstowe z tym jednym, pomijając porównywanie się z samym sobą, następnie sortuje je wszystkie według wyniku, tak że mecz numer 1 jest na górze.

Daje takie wyniki:

29 - bieberwords.txt

10 - opethwords.txt

Jack
źródło