Durchsuchen mehrerer Dokumente nach häufig verwendeten Wörtern

440
ioloiol

Ich habe die Texte zu einem Lied. (.TXT)

Ich habe auch Texte zu 50 anderen Liedern.

Ich suche nach einer Möglichkeit, diese 50 Liedtexte mit den Texten zum ersten Lied zu analysieren und zu durchsuchen, und finde heraus, welcher der 50 dem ersten am ähnlichsten ist (basierend auf gemeinsamen Wörtern / Vokabeln).

Es tut mir leid für Laien sprechen - das ist nicht mein Wissensbereich (!)

Jede Hilfe oder Hinweise wäre sehr dankbar

1
Es wäre hilfreich, einige Samples und gewünschte Ausgaben zu haben. fedorqui vor 10 Jahren 0
Wenn Sie die aktuelle Billboard-Nummer 1 mit 50 anderen Songs verglichen haben, würden Sie folgende Ausgabe erhalten: SORTED BY MOST SIMILAR 1) "MAROON 5 - ANIMALS", shared words = Ärger, Hut, Mantel, ich, jemand, Hilfe, Kuchen usw. 2) "ARTIST - SONG NAME", geteilte Wörter = hübsch, nie, nur Hilfe, usw. 3) "ARTIST - SONG NAME", gemeinsam genutzte Wörter: x, x , x, x. Die ideale gewünschte Ausgabe wäre die 50 Liedtexte, die nach "Ähnlichkeit" sortiert sind, mit hervorgehobenen gemeinsamen Wörtern. Ich hoffe, das hilft, ich arbeite im Video - die komplexe Suche liegt außerhalb meiner Komfortzone! Prost ioloiol vor 10 Jahren 0
Ein Problem ist, dass Sie eine Liste von Wörtern benötigen, die Sie ignorieren könnten, wie "The", "And", "la la la" usw. Jack vor 9 Jahren 0

1 Antwort auf die Frage

0
Jack

Hier ist meine Lösung, ich nahm an, dass es Ihnen nur wichtig ist, wie viele Wörter übereinstimmen, und nicht so oft, wie oft sie übereinstimmen (z. B. "Baby" 5-mal in beiden Songs ist 5x so viele Punkte wert).

Zuerst:

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 

Dadurch werden alle Zeilenumbrüche in Leerzeichen umgewandelt, alle nicht alphanumerischen Zeichen (Kommas) werden entfernt, doppelte Leerzeichen werden entfernt, jedes Wort wird in eine separate Zeile eingefügt, sortiert und doppelte Zeilen werden entfernt.

Sie müssen dies für alle Songs tun, die Sie vergleichen möchten, und dann zweitens:

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

Dies gibt Ihnen eine Anzahl von Wörtern, wie viele Wörter übereinstimmen.

Ich habe ein paar Beispiele ausprobiert:

Maroon 5's Animals und Justin Bieber's Baby teilen 29 Wörter.

Die Tiere von Maroon 5 und Opeths große Beschwörung teilen sich 10 Wörter.

Das sind die Ergebnisse, die Sie erwarten würden.

Und so würden Sie es mit allen anderen Textdateien vergleichen:

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 

Wobei 'songname1words.txt' der Dateiname ist, mit dem Sie alle vergleichen möchten.

Dies vergleicht alle anderen Textdateien mit dieser, überspringt den Vergleich mit sich selbst und sortiert sie dann nach Punktzahl, so dass die Übereinstimmung mit der Nummer 1 ganz oben steht.

Es gibt Ausgabe wie folgt:

29 - bieberwords.txt

10 - opethwords.txt