Ich habe eine Tabelle in PostgreSQL, wo eine Spalte ein Text ist. Ich brauche eine Bibliothek oder ein Tool, die die Sprache jedes Textes für einen Testzweck identifizieren können.
Es ist kein PostgreSQL-Code erforderlich, weil ich Probleme habe, Sprachen zu installieren, aber jede Sprache, die sich mit der Datenbank verbinden kann, die Texte abrufen und sie identifizieren kann, ist willkommen.
Ich habe Lingua::Identify
in den Antworten direkt im Perl-Skript vorgeschlagen, es hat funktioniert, aber die Ergebnisse sind nicht präzise.
Die Texte, die ich identifizieren möchte, kommen aus dem Internet und die meisten sind in Portugiesisch, aber Lingua::Identify
klassifiziert sehr ähnlich wie Französisch, Italienisch und Spanisch, die ähnliche Sprachen sind.
Ich brauche etwas Präzises.
Ich habe die Tags java
und r
hinzugefügt, weil die Sprachen, die ich im System und in der Lösung verwende, leicht zu implementieren sind, aber Lösungen in jeder Sprache sind willkommen.
Probieren Sie diese aus:
Dieser Blogbeitrag teilt einige Tests, um die beiden Bibliotheken zu vergleichen (zusammen mit einem 3rd - das Sprachidentifizierungsmodul von Apache Tika, das wirklich ein komplettes Toolkit für die Textanalyse ist).
Sie können PL / Perl verwenden ( CREATE FUNCTION
langof(text) LANGUAGE
plperlu
AS ...
) mit Lingua :: Identifizieren CPAN-Modul.
Perl-Skript:
%Vor%Und die Funktion:
%Vor%Funktioniert für mich:
%Vor%PL / Perl Sprachbibliothek (plperl.dll) ist im neuesten Windows Installer von Postgres vorinstalliert.
Um PL / Perl zu verwenden, benötigen Sie den Perl-Interpreter selbst. Insbesondere Perl 5.14 (zum Zeitpunkt dieses Schreibens). Das häufigste Installationsprogramm ist ActiveState, aber es ist nicht kostenlos. Freie kommt von StrawberryPerl . Stellen Sie sicher, dass PERL514.DLL
vorhanden ist.
Melden Sie sich nach der Installation von Perl in Ihrer postgres-Datenbank an und versuchen Sie
auszuführen %Vor%Wenn es um Qualität geht, haben Sie einige Möglichkeiten: Sie können Lingua verbessern :: Identifizieren Sie sich selbst (es ist Open Source) oder Sie könnten eine andere Bibliothek ausprobieren. Ich fand dieses , was kommerziell ist, aber vielversprechend aussieht.
Naive Bayes Klassifikatoren sind sehr gut bei Spracherkennung . Sie finden Implementierungen in allen wichtigen Sprachen, oder Sie können selbst eine implementieren, es ist nicht extrem schwierig. Der Wikipedia-Eintrag ist auch interessant: Ссылка .
Das Problem mit der Spracherkennung ist, dass es niemals vollständig präzise sein wird. Mein Browser entlarvt die Sprache oft falsch, und sie wurde von Google gemacht, die wahrscheinlich eine Menge guter Köpfe zu diesen Aufgaben gebracht hat.
Aber hier sind einige Punkte zu beachten:
Ich bin nicht sicher, was Perls Lingua::Identify
modul wirklich benutzt, aber meistens werden diese Aufgaben von naiven Baysian-Modellen gehandhabt, wie jemand in einer anderen Antwort darauf hingewiesen hat. Baysianische Modelle verwenden Wahrscheinlichkeit, um sie in eine Reihe von Kategorien einzuteilen, in Ihrem Fall wären dies unterschiedliche Sprachen. Nun sind diese Wahrscheinlichkeiten beide abhängige Wahrscheinlichkeiten, d. H. Wie oft ein bestimmtes Merkmal für jede Kategorie erscheint, sowie unabhängige (vorherige) Wahrscheinlichkeiten, d. H. Wie oft jede Kategorie insgesamt erscheint.
Da diese beiden Informationen verwendet werden, ist es sehr wahrscheinlich, dass Sie eine niedrige Vorhersagequalität erhalten, wenn die Prioren falsch liegen. Ich denke, Linua::Identify
wurde meistens von einem Korpus von Online-Dokumenten trainiert, so dass die höchste Priorität wahrscheinlich Englisch ist. Was das bedeutet, dass Lingua::Identify
Ihre Dokumente höchstwahrscheinlich als Englisch einstufen wird, es sei denn, es gibt schwerwiegende Gründe, etwas anderes zu glauben (In Ihrem Fall hat es wahrscheinlich schwerwiegenden Grund, weil Sie Ihre Dokumente als italienisch, französisch und spanisch falsch einstufen ).
Dies bedeutet, dass Sie versuchen sollten, Ihr Modell nach Möglichkeit zu trainieren. Möglicherweise gibt es einige Methoden in Lingua::Identify
, um Ihnen dabei zu helfen. Wenn nicht, würde ich vorschlagen, dass Sie Ihren eigenen Naive Bayes Klassifikator schreiben (es ist eigentlich ganz einfach).
Wenn Sie einen Naive Bayes Classifier haben, müssen Sie sich für eine Reihe von Features entscheiden. Meistens sind die Buchstabenhäufigkeiten für jede Sprache sehr charakteristisch, also wäre dies eine erste Schätzung. Versuchen Sie einfach, Ihren Klassifikator zuerst auf diesen Frequenzen zu trainieren. Naive Bayes Classifier werden in Spamfiltern verwendet, so dass Sie sie wie eine von diesen trainieren können. Lassen Sie es in einem Beispielsatz ablaufen und aktualisieren Sie den Klassifizierer bei jeder Fehlklassifizierung auf die korrekte Klassifizierung. Nach einer Weile wird es immer weniger falsch.
Wenn Ihnen die Häufigkeit eines einzelnen Buchstabens nicht ausreicht, können Sie stattdessen versuchen, N-Gramme zu verwenden (beachten Sie jedoch die kombinatorische Explosion, die Sie einführen werden). Ich würde nicht vorschlagen, jemals mehr als 3 Gramm auszuprobieren. Falls dies immer noch nicht zu guten Ergebnissen führt, versuchen Sie, eindeutige häufig verwendete Wörter in jeder Sprache manuell zu identifizieren und diese zu Ihrem Funktionsumfang hinzuzufügen. Ich bin mir sicher, sobald Sie anfangen, daran zu experimentieren, werden Sie mehr Ideen für Features bekommen, die Sie ausprobieren können.
Eine weitere nette Sache bei der Verwendung von Bayes-Klassifizierern ist, dass Sie immer neue Informationen hinzufügen können, falls mehr Dokumente eintreffen, die nicht mit den trainierten Daten übereinstimmen. In diesem Fall können Sie einfach einige der neuen Dokumente neu klassifizieren und ähnlich wie bei einem Spam-Filter passt sich der Klassifikator an die sich verändernde Umgebung an.
Ich habe eine Bibliothek namens TextCat gefunden, die unter LGPL verfügbar ist. Ich kann nicht sagen, was die Qualität seiner Identifikation ist, aber es hat ein Online-Demo-Formular, also können Sie vielleicht etwas Text darauf werfen, bevor Sie entscheiden, ob es sich lohnt, herunterzuladen.
Es ist auch in Perl geschrieben, also wenn Sie es verwenden möchten, wäre der Ansatz in filiprem 's Antwort ein guter Ausgangspunkt.
Tags und Links language-agnostic java r postgresql language-detection