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.
Antworten:
Haben Sie sich langdetect angesehen ?
from langdetect import detect lang = detect("Ein, zwei, drei, vier") print lang #output: de
quelle
ro
(Rumänisch). In solchen Fällen ist eine Ausgabe in mehreren Sprachen erforderlich. Polyglot funktioniert viel besser.langdetect
können verschiedene Sprachen bestimmt werden :-)TextBlob . Benötigt NLTK-Paket, verwendet Google.
from textblob import TextBlob b = TextBlob("bonjour") b.detect_language()
pip install textblob
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 nurpip 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
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
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
rate_language Kann mit dieser Rechtschreibprüfung mit Wörterbüchern sehr kurze Beispiele erkennen .
pip install guess_language-spirit
langid bietet beide Module
import langid langid.classify("This is a test") # ('en', -54.41310358047485)
und ein Kommandozeilen-Tool:
pip install langid
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
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
quelle
detectlang
ist viel schneller alsTextblob
polyglot
Am Ende war ich der Performanteste für meinen Anwendungsfall.langid
kam in der zweitenEs gibt ein Problem,
langdetect
wenn es für die Parallelisierung verwendet wird und fehlschlägt. Aberspacy_langdetect
ist 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)
quelle
langdetect
. Ich habe eine DF-Spalte mit Texten, die ichcolumn.apply()
mit einer Funktion machescipy_langdetect
. Irgendwelche Vorschläge?dask
, sonst würde es keinen Unterschied machen.Wenn Sie nach einer Bibliothek suchen , die schnell mit langen Texten ist
polyglot
undfastext
hier 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.
quelle
polyglot
Spracherkennung basiert aufpycld2
, 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.\n
Zeichen 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\n
sollen und dass meine Ergebnisse nur den ersten Satz (dh vor dem ersten\n
)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
quelle
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:
Spracherkennung:
>>> from googletrans import Translator >>> t = Translator().detect("hello world!") >>> t.lang 'en' >>> t.confidence 0.8225234
quelle
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.
quelle
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.
quelle
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:
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...)
quelle