GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Häufigkeit von Wörtern in nicht-englischsprachigen Texten:Wie kann ich Singular- und Pluralformen usw. zusammenführen?

Ich sortiere Französisch Sprachwörter in einigen Textdateien nach Häufigkeit mit Fokus auf Einblick eher als statistische Signifikanz. Die Herausforderung besteht darin, akzentuierte Zeichen beizubehalten und mit den Artikelformen vor Vokalen umzugehen (l' , d' ) im Zusammenhang mit der Formung von Wort-Tokens zum Sortieren.

Das Thema der häufigsten Wörter in einer Datei nimmt viele Formen an (1 | 2 | 3 | 4). Also habe ich diese Funktion mit GNU zusammengestellt Dienstprogramme:

compt1 () {
for i in *.txt; do
    echo "File: $i"
    sed -e 's/ /
/g' <"$i" | sed -e 's/^[[:alpha:]][[:punct:]](.*)/1/' | sed -e 's/(.*)/L1/' | grep -hEo "[[:alnum:]_'-]+" | grep -Fvwf /path_to_stop_words_file | sort | uniq -c | sort -rn 
done
}

…die Leerzeichen gegen Zeilenumbrüche tauscht; kürzt ein Zeichen, gefolgt von einem Satzzeichen, das sich am Anfang der Zeile befindet; wandelt dann alles in Kleinbuchstaben um; verwendet dieses kompakte grep Konstrukt, das Wortbestandteilszeichen abgleicht, um Token zu erzeugen; dann werden die Stoppwörter entfernt, und schließlich gibt es die übliche Sortierung. Die Stoppdatei enthält ein Segment mit einzelnen Zeichen, daher müssen Sie bei der Verwendung vorsichtig sein, aber die bereitgestellte Analyse zum Erstellen von Wortstämmen in verschiedenen Sprachen ist wirklich interessant!

Wenn ich jetzt die Häufigkeit eines signifikanten Wortes mit der Ausgabe von grep -c vergleiche direkt auf den Dateien, ich denke, es ist innerhalb einer gewissen Fehlerspanne nah genug.

Fragen :

  • Wie könnte ich dies ändern, um die Häufigkeit von Pluralformen mit ihren
    Singularformen zusammenzuführen, d. h. Wörter, die ein gemeinsames Präfix mit einem variierenden Suffix von
    Zeichen teilen?
  • Ich versuche zu beurteilen, ob grep Teil würde insbesondere mit dem funktionieren, was auf OSX ist ?

Akzeptierte Antwort:

Mit einem simplen sed werden Sie das wirklich nicht schaffen Skript. Ich gehe davon aus, dass Sie auf „Zitatformen“ reduzieren und alle Beugungen in eine Grundform zusammenfassen möchten.

Das bedeutet, dass Adjektive wie protegé, protégés, protégée, protégées verwendet werden alle zählen als dasselbe, das Basisadjektiv/Partizip protégé . Ebenso alle Beugungen des Verbs protéger — wie Schützling, Schützlinge, Schützlinge, Schützling, Schützlinge, Schützling, Schützling , usw. – würden alle auf dieses Basisverb reduziert.

Das bedeutet, dass Sie Dinge über die Flexionsmorphologie der Sprache wissen müssen. Schlimmer noch, Sie müssen etwas über die tatsächliche Syntax der Sprache verstehen, einschließlich der Beugungen und der Unterscheidung von Homographen.

Ich habe sehr getan einfache Ansätze für zumindest den ersten Teil davon mit Perl. Es ist wirklich eher ein Schmerz im Hintern. Hier ist ein Codebeispiel, das ich zum Generieren von Sortierschlüsseln für Städte und Gemeinden auf der iberischen Halbinsel verwendet habe:

       # 1st strip leading articles
          s/^L'//;    # Catalan
          s{ ^
            (?:
        # Castilian
                El
              | Los
              | La
              | Las

        # Catalan 
              | Els
              | Les         
              | Sa
              | Es

        # Gallego
              | O       
              | Os
              | A
              | As      
            ) 
            s+ 
          }{}x;
        # 2nd strip interior particles
          s/b[dl]'//g;   # Catalan
          s{ 
            b
            (?:
                el  | los | la | las | de  | del | y          # ES
              | els | les | i  | sa | es | dels               # CA 
              | o   | os  | a  | as  | do  | da | dos | das   # GAL
            )
            b
        }{}gx;

Dadurch werden die Artikel und Partikel entschichtet, sodass sie nicht zur Sortierung zählen. Aber Sie müssen sich mit Formen wie l’autre auseinandersetzen mit einem sogenannten Curly-Quote, das eigentlich U+2019 RIGHT SINGLE QUOTATION MARK ist, die bevorzugte Form für das Apostroph. Ich habe diese mit einem s/’/'/g in gerade normalisiert zuerst.

Verwandte:Unterschied zwischen Anmelde-Shell und Nicht-Anmelde-Shell?

Oh, und Sie müssen sich mit Kodierungen auseinandersetzen:MacRoman ist nicht dasselbe wie UTF-8 oder ISO-8859-1 – noch lange nicht.

Ehrlich gesagt möchten Sie wahrscheinlich so etwas wie den Snowball-Stemming-Algorithmus verwenden und Französisch als Sprache angeben. Sicherlich Perls Lingua::Stem::Snowball Modul weiß, wie das geht. Mit dieser Abfrage können Sie nach Perl-Modulen suchen, die mit französischer Linguistik zu tun haben.

Aber Stemmen wird Sie nur so weit bringen. Sie werden nicht wirklich gute Arbeit leisten, bis Sie die morphosyntaktische Analyse anwenden – was bedeutet, dass Sie einen Parse für die Sätze generieren und dort jedem Element Wortarten zuweisen müssen.

Dies erfordert viel mehr Arbeit. Die gute Nachricht ist, dass es dafür spezielle Tools gibt, von denen einige tatsächlich auf Französisch funktionieren. Aber das reißt schon ganz schön ab, denn jetzt hast du dich in die Bereiche Natural Language Processing und Computerlinguistik gewagt. Für solche Fragen gibt es hier kein großes Zuhause, aber sie werden wahrscheinlich besser auf Linguistics.SE beantwortet; Ich weiß es nicht.


Linux
  1. Wie kann Cloud-Technologie eLearning und Fernunterricht unterstützen?

  2. Wie kann ich Wörter zwischen den ersten beiden Instanzen von Text/Muster erhalten?

  3. Wie kann ich ls nach Besitzer und Gruppe sortieren?

  4. Wie kann ich Klartext in Linux rechtfertigen?

  5. Wie werden \n und \r unter Linux und Windows unterschiedlich gehandhabt?

Wie man Textdateien unter Linux vergleicht und zusammenführt

Wie man Textdateien unter Linux vergleicht und zusammenführt (Teil 2)

Wie man Markierungen verwendet und eine Textauswahl in Vim durchführt

So suchen und ersetzen Sie Text, Wort oder Zeichenfolge in einer Datei

So installieren und verwenden Sie Sublime Text 4 unter Linux

So finden und ersetzen Sie Text in Vim