Python: Wie bestimme ich die Sprache?


86

Ich möchte das bekommen:

Input text: "ру́сский язы́к"
Output text: "Russian" 

Input text: "中文"
Output text: "Chinese" 

Input text: "にほんご"
Output text: "Japanese" 

Input text: "العَرَبِيَّة"
Output text: "Arabic"

Wie kann ich das in Python machen? Vielen Dank.


2
Was hast du versucht?
Raskayu


Schön zusammengefasst hier stackoverflow.com/a/48436520/2063605
SNA

Antworten:


56

Haben Sie sich langdetect angesehen ?

from langdetect import detect

lang = detect("Ein, zwei, drei, vier")

print lang
#output: de

26
Nicht sehr genau - erkennt die Sprache des Textes 'anatomische Struktur' als ro(Rumänisch). In solchen Fällen ist eine Ausgabe in mehreren Sprachen erforderlich. Polyglot funktioniert viel besser.
Yuriy Petrovskiy

1
Interessant, für das gleiche Beispiel langdetectkönnen verschiedene Sprachen bestimmt werden :-)
Denis Kuzin

1
aus irgendeinem Grund wird langdetect Fehler gegeben, ich benutze Python 3.6
Anspielung

182
  1. TextBlob . Benötigt NLTK-Paket, verwendet Google.

    from textblob import TextBlob
    b = TextBlob("bonjour")
    b.detect_language()
    

    pip install textblob

  2. Polyglot . Benötigt Numpy und einige arkane Bibliotheken, die für Windows wahrscheinlich nicht funktionieren . (Für Windows, erhält eine entsprechenden Versionen von PyICU , Morfessor und PyCLD2 von hier , dann nur pip install downloaded_wheel.whl.) Able Texte mit gemischten Sprachen zu erkennen.

    from polyglot.detect import Detector
    
    mixed_text = u"""
    China (simplified Chinese: 中国; traditional Chinese: 中國),
    officially the People's Republic of China (PRC), is a sovereign state
    located in East Asia.
    """
    for language in Detector(mixed_text).languages:
            print(language)
    
    # name: English     code: en       confidence:  87.0 read bytes:  1154
    # name: Chinese     code: zh_Hant  confidence:   5.0 read bytes:  1755
    # name: un          code: un       confidence:   0.0 read bytes:     0
    

    pip install polyglot

    Führen Sie zum Installieren der Abhängigkeiten Folgendes aus: sudo apt-get install python-numpy libicu-dev

  3. Chardet hat auch eine Funktion zum Erkennen von Sprachen, wenn sich Zeichenbytes im Bereich befinden (127-255]:

    >>> chardet.detect("Я люблю вкусные пампушки".encode('cp1251'))
    {'encoding': 'windows-1251', 'confidence': 0.9637267119204621, 'language': 'Russian'}
    

    pip install chardet

  4. langdetect Benötigt große Textteile. Es verwendet einen nicht deterministischen Ansatz unter der Haube. Das bedeutet, dass Sie für dasselbe Textbeispiel unterschiedliche Ergebnisse erhalten. Ärzte sagen, dass Sie folgenden Code verwenden müssen, um ihn zu bestimmen:

    from langdetect import detect, DetectorFactory
    DetectorFactory.seed = 0
    detect('今一はお前さん')
    

    pip install langdetect

  5. rate_language Kann mit dieser Rechtschreibprüfung mit Wörterbüchern sehr kurze Beispiele erkennen .

    pip install guess_language-spirit

  6. langid bietet beide Module

    import langid
    langid.classify("This is a test")
    # ('en', -54.41310358047485)
    

    und ein Kommandozeilen-Tool:

    $ langid < README.md
    

    pip install langid

  7. FastText ist ein Textklassifizierer, mit dem 176 Sprachen mit geeigneten Modellen für die Sprachklassifizierung erkannt werden können . Laden Sie dieses Modell herunter :

    import fasttext
    model = fasttext.load_model('lid.176.ftz')
    print(model.predict('الشمس تشرق', k=2))  # top 2 matching languages
    
    (('__label__ar', '__label__fa'), array([0.98124713, 0.01265871]))
    

    pip install fasttext

  8. pyCLD3 ist ein neuronales Netzwerkmodell zur Sprachidentifikation. Dieses Paket enthält den Inferenzcode und ein trainiertes Modell.

    import cld3
    cld3.get_language("影響包含對氣候的變化以及自然資源的枯竭程度")
    
    LanguagePrediction(language='zh', probability=0.999969482421875, is_reliable=True, proportion=1.0)
    

    pip install pycld3


2
detectlangist viel schneller alsTextblob
Anwarvic

6
@Anwarvic TextBlob verwendet die Google-API ( github.com/sloria/TextBlob/blob/dev/textblob/translate.py#L33 )! deshalb ist es langsam.
Thomas Decaux

3
polyglotAm Ende war ich der Performanteste für meinen Anwendungsfall. langidkam in der zweiten
Jamescampbell

3
Sie müssen sich nicht mit dem gesamten Polyglot-Paket befassen, wenn Sie nur die Spracherkennung benötigen. Wie in den Dokumenten angegeben , erfolgt die Erkennung durch pyCLD2 , eine sehr einfache und benutzerfreundliche Bibliothek.
Jeyekomon

1
Es gibt auch pyCLD3 .
tttthomasssss

7

Es gibt ein Problem, langdetectwenn es für die Parallelisierung verwendet wird und fehlschlägt. Aber spacy_langdetectist ein Wrapper dafür und Sie können es für diesen Zweck verwenden. Sie können auch das folgende Snippet verwenden:

import spacy
from spacy_langdetect import LanguageDetector

nlp = spacy.load("en")
nlp.add_pipe(LanguageDetector(), name="language_detector", last=True)
text = "This is English text Er lebt mit seinen Eltern und seiner Schwester in Berlin. Yo me divierto todos los días en el parque. Je m'appelle Angélica Summer, j'ai 12 ans et je suis canadienne."
doc = nlp(text)
# document level language detection. Think of it like average language of document!
print(doc._.language['language'])
# sentence level language detection
for i, sent in enumerate(doc.sents):
    print(sent, sent._.language)

Ich bin Ihrer Antwort gefolgt, aber ich glaube, ich bekomme immer noch die gleiche Geschwindigkeit wie beim langdetect. Ich habe eine DF-Spalte mit Texten, die ich column.apply()mit einer Funktion mache scipy_langdetect. Irgendwelche Vorschläge?
Rishabh Sahrawat

Sie müssen eine parallele Bibliothek verwenden, um die Parallelisierung der Funktion wie nutzen zu können dask, sonst würde es keinen Unterschied machen.
Habib Karbasian

3

Wenn Sie nach einer Bibliothek suchen , die schnell mit langen Texten ist polyglotund fastexthier den besten Job macht.

Ich habe 10000 Dokumente aus einer Sammlung schmutziger und zufälliger HTMLs abgetastet. Hier sind die Ergebnisse:

+------------+----------+
| Library    | Time     |
+------------+----------+
| polyglot   | 3.67 s   |
+------------+----------+
| fasttext   | 6.41     |
+------------+----------+
| cld3       | 14 s     |
+------------+----------+
| langid     | 1min 8s  |
+------------+----------+
| langdetect | 2min 53s |
+------------+----------+
| chardet    | 4min 36s |
+------------+----------+

Mir ist aufgefallen, dass sich viele Methoden auf kurze Texte konzentrieren, wahrscheinlich weil es schwierig ist, das Problem zu lösen: Wenn Sie viel Text haben, ist es wirklich einfach, Sprachen zu erkennen (z. B. könnte man einfach ein Wörterbuch verwenden!). Dies macht es jedoch schwierig, eine einfache und geeignete Methode für lange Texte zu finden.


polyglotSpracherkennung basiert auf pycld2, das ist insgesamt nicht so schnell. Oder gibt es eine Möglichkeit, die Sprache in einer Art Batch-Modus zu identifizieren? Ich habe nur versucht, Satz für Satz umzugehen.
Wiktor Stribiżew

Ich gehe davon aus, dass der Langtext in derselben Sprache ist. Ich lese die 10000 Dokumente und bewahre sie auf. Für fastextcc muss ich die \nZeichen entfernen , aber nicht für polyglot (cdl2-Ergebnisse waren ziemlich gleich, ich habe es auch getestet). Ich verstehe nicht, warum du denkst, dass Polyglot langsam ist. Es war das schnellste. Glaubst du, ich hätte das auch entfernen \nsollen und dass meine Ergebnisse nur den ersten Satz (dh vor dem ersten \n)
widerspiegeln

Ich meine, ich überprüfe Sprachen von Millionen separater Dokumente, die alle einzeilige Zeichenfolgen sind. Das ist langsam mit pycld2.
Wiktor Stribiżew

Ich verstehe, ich glaube nicht, dass es einen Weg gibt, das zu tun. Du musst es eins nach dem anderen tun. Je nachdem, wo Ihre Dokumente gespeichert sind, können Sie möglicherweise die Multiprozessor-Funktionen verwenden. Außerdem habe ich fasttextcc nicht mehr verwendet, weil ich Probleme mit der Codierung in asiatischer Sprache hatte.
toto_tico

In meinem Fall waren die meisten Dokumente lang, und ein Benchmark könnte mit kurzen Sätzen ganz anders aussehen.
toto_tico

2

Je nach Fall könnten Sie an einer der folgenden Methoden interessiert sein:

Methode 0: Verwenden Sie eine API oder Bibliothek

Normalerweise gibt es einige Probleme mit diesen Bibliotheken, da einige von ihnen für kleine Texte nicht genau sind, einige Sprachen fehlen, langsam sind, eine Internetverbindung erfordern, nicht frei sind, ... Aber im Allgemeinen werden sie den meisten Anforderungen gerecht .

Methode 1: Sprachmodelle

Ein Sprachmodell gibt uns die Wahrscheinlichkeit einer Folge von Wörtern. Dies ist wichtig, da wir so die Sprache eines Textes zuverlässig erkennen können, auch wenn der Text Wörter in anderen Sprachen enthält (z. B.: "Hola" bedeutet auf Spanisch "Hallo" ).

Sie können N Sprachmodelle (eines pro Sprache) verwenden, um Ihren Text zu bewerten. Die erkannte Sprache ist die Sprache des Modells, mit dem Sie die höchste Punktzahl erzielt haben.

Wenn Sie ein einfaches Sprachmodell dafür erstellen möchten, würde ich 1 Gramm wählen. Dazu müssen Sie nur zählen, wie oft jedes Wort aus einem großen Text (z. B. Wikipedia Corpus in der Sprache "X") angezeigt wurde.

Dann ist die Wahrscheinlichkeit eines Wortes seine Häufigkeit geteilt durch die Gesamtzahl der analysierten Wörter (Summe aller Häufigkeiten).

the 23135851162
of  13151942776
and 12997637966
to  12136980858
a   9081174698
in  8469404971
for 5933321709
...

=> P("'Hola' means 'hello' in spanish") = P("hola") * P("means") * P("hello") * P("in") * P("spanish")

Wenn der zu erkennende Text ziemlich groß ist, empfehle ich, N zufällige Wörter abzutasten und dann die Summe der Logarithmen anstelle von Multiplikationen zu verwenden, um Gleitkommapräzisionsprobleme zu vermeiden.

P(s) = 0.03 * 0.01 * 0.014 = 0.0000042
P(s) = log10(0.03) + log10(0.01) + log10(0.014) = -5.376

Methode 2: Mengen schneiden

Ein noch einfacherer Ansatz besteht darin, N Sätze (einen pro Sprache) mit den häufigsten M häufigsten Wörtern vorzubereiten. Dann schneiden Sie Ihren Text mit jedem Satz. Das Set mit der höchsten Anzahl von Kreuzungen ist Ihre erkannte Sprache.

spanish_set = {"de", "hola", "la", "casa",...}
english_set = {"of", "hello", "the", "house",...}
czech_set = {"z", "ahoj", "závěrky", "dům",...}
...

text_set = {"hola", "means", "hello", "in", "spanish"}

spanish_votes = text_set.intersection(spanish_set)  # 1
english_votes = text_set.intersection(english_set)  # 4
czech_votes = text_set.intersection(czech_set)  # 0
...

Methode 3: Zip-Komprimierung

Dies ist mehr eine Kuriosität als alles andere, aber hier ist es ... Sie können Ihren Text komprimieren (z. B. LZ77) und dann den Reißverschlussabstand in Bezug auf einen komprimierten Referenztext (Zielsprache) messen. Persönlich hat es mir nicht gefallen, weil es langsamer, weniger genau und weniger beschreibend ist als andere Methoden. Dennoch könnte es interessante Anwendungen für diese Methode geben. Lesen Sie mehr: Sprachbäume und Zippen


2

Sie können Googletrans (inoffiziell) verwenden, eine kostenlose und unbegrenzte Google Übersetzungs-API für Python.

Sie können so viele Anfragen stellen, wie Sie möchten, es gibt keine Grenzen

Installation:

$ pip install googletrans

Spracherkennung:

>>> from googletrans import Translator
>>> t = Translator().detect("hello world!")
>>> t.lang
'en'
>>> t.confidence
0.8225234

1

Das vorgefertigte schnelle Textmodell funktionierte am besten für meine ähnlichen Bedürfnisse

Ich bin mit einem sehr ähnlichen Bedürfnis zu Ihrer Frage gekommen. Ich fand die größte Hilfe aus Rabashs Antworten für meine spezifischen Bedürfnisse.

Nachdem ich experimentiert hatte, um herauszufinden, was unter seinen Empfehlungen am besten funktioniert, nämlich sicherzustellen, dass Textdateien in mehr als 60.000 Textdateien auf Englisch vorliegen, stellte ich fest, dass Fasttext ein hervorragendes Werkzeug für eine solche Aufgabe ist.

Mit ein wenig Arbeit hatte ich ein Tool, das über viele Dateien sehr schnell arbeitete. Aber es könnte leicht für so etwas wie Ihren Fall geändert werden, da Fasttext leicht über eine Liste von Zeilen funktioniert.

Mein Code mit Kommentaren gehört zu den Antworten in DIESEM Beitrag. Ich glaube, dass Sie und andere diesen Code leicht für andere spezifische Anforderungen ändern können.


0

Sie können versuchen, die Unicode-Zeichengruppe in der Eingabezeichenfolge zu bestimmen, um auf den Sprachtyp hinzuweisen (z. B. Kyrillisch für Russisch), und dann nach sprachspezifischen Symbolen im Text suchen.


0

Ich habe alle Bibliotheken da draußen ausprobiert und bin zu dem Schluss gekommen, dass pycld2 die beste ist, schnell und genau.

Sie können es so installieren:

python -m pip install -U pycld2

Sie können es so verwenden:

isReliable, textBytesFound, details = cld2.detect(your_sentence)

print(isReliable, details[0][1]) # reliablity(bool),lang abbrev.(en/es/de...)   
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.