[JAVA] Es wurde eine API veröffentlicht, die Satzstücke wie morphologische Analysen verwenden kann

Nachtrag 2017/4/13: Ich habe Rat von Herrn taku910 selbst erhalten. Weitere Informationen finden Sie im Kommentarbereich. Dieser Artikel wird später überarbeitet. Nachskript 2017/4/18: Die öffentliche API wurde geändert. Unigram baut noch ein Modell (es endet auch nach 5 Tagen nicht). Nachskript 2017/4/26: Unigram ist ebenfalls verfügbar (nach 12 Tagen ist es endlich vorbei). Details zu dieser Angelegenheit wurden in Ein weiterer Artikel veröffentlicht.

Einführung

API

Beispielcode

In Verbindung stehender Artikel

Implementierungsdetails

Um es kurz zu erklären

  1. Wenden Sie Satzstück auf japanische Wikipedia-Artikel an
  2. Formatieren Sie die Vokaldatei, die die Ausgabe von Satzstück ist, in das Wörterbuchformat von mecab-ipadic.
  3. Kompilieren Sie das gesamte Wörterbuch mit kuromoji.

Lassen Sie mich etwas näher erläutern.

1. Wenden Sie Satzstück auf japanische Wikipedia-Artikel an

Die Daten der japanischen Wikipedia, die ich hatte, waren ein wenig alt mit dem Dump von 20160915, aber ich habe dies als Originaldaten verwendet. Ich gestalte es mit einigen Modifikationen. Wenn Sie auflisten, was Sie getan haben

  1. Dump wird mit wp2txt in Text konvertiert und alle in einer Datei zusammengefasst.
  2. Löschen Sie Zeilen mit maximal 40 Zeichen
  3. Löschen Sie "Bild", "Datei", "Bild" und "Datei" am Zeilenanfang.
  4. Vertauschen Sie die Zeilen in der Datei nach dem Zufallsprinzip
  5. Führen Sie das Satzstück mit den ersten 1.700.000 Zeilen (ca. 600 MB) aus.

Der Grund, warum ich das mache, ist, dass SentencePiece anscheinend viel Speicher benötigt und ich den vollständigen Text (ca. 2 GB) auf meinem PC (16 GB Speicher) nicht eingeben konnte. Nach vielen Versuchen und Irrtümern scheinen etwa 600 MB die Grenze für einen 16-GB-PC zu sein. Stattdessen ist der Prozess schnell, solange sich die Daten im Speicher befinden.

Satzstück wird mit dem folgenden Befehl ausgeführt. In Bezug auf die Ausführungsumgebung habe ich Cygwin in Windows 10 integriert und ausgeführt. Die notwendige Bibliothek in der ursprünglichen README war Cygwin und ich habe so etwas eingefügt (einige Versionen stimmen nicht überein, aber es hat funktioniert).

$ ./spm_train --input=input.txt --model_prefix=output --vocab_size=8000 --model_type=bpe

Die Ausgabe ist eine Gesangsdatei und eine Modelldatei. Die Vokabeldatei ist ein Wortfragment mit 8000 Zeilen.

2. Formatieren Sie die Vokaldatei, die die Ausgabe von Satzstück ist, in das Wörterbuchformat von mecab-ipadic.

Bereiten Sie sich jetzt auf die Veröffentlichung mit der Web-API vor. Die Web-API-Antwort gibt einen Satz von "Wortfragment" und "Wortfragment-ID" als Array zurück. Verwenden Sie beispielsweise "Word Fragment ID", wenn Sie beim maschinellen Lernen einen One-Hot-Vektor erstellen. Natürlich müssen Sie es nicht verwenden.

Betrachten wir nun die Implementierung. Der von mir ausgeführte Web-API-Marktplatz Apitore ist vollständig in Java implementiert, Satzsatz ist jedoch in C ++ geschrieben. "Es ist mühsam, einen Wrapper zu schreiben, und ich verstehe WebAPI in C ++ nicht wirklich ... also muss ich es gewaltsam erkennen! Satzteil ist wie eine morphologische Analyse, nicht wahr?" Ich entschied mich für den Java Morphological Analyzer kuromoji. kuromoji ist die Java-Version des berühmten Mecab. Und Mecab ist die Forschungstechnologie von Herrn Kudo, der Satzstück gemacht hat. Du bist verbunden!

Dieses Mal habe ich die Ausgabe von Satzstück als neues Wörterbuch zum vorhandenen Kuromoji hinzugefügt. Stattdessen hier einige Tricks. Das Format des Wörterbuchs sieht folgendermaßen aus.

#Oberflächentyp,Linke Kontext-ID,Richtige Kontext-ID,Kosten,Teil,Teil細分類1,Teil細分類2,Teil細分類3,Nutzungsart,Nutzungsart,Prototyp,lesen,Aussprache
Getan werden,1,1,1,SPWORD,1,*,*,*,*,*,*,*

Die "Oberflächenform" ist das "Wortfragment", das die Ausgabe von Satzstück ist. Der Punkt ist, die "Kosten" auf "1" zu setzen. Wenn "Kosten" auf "1" gesetzt ist, wird das Wortfragment des Satzstücks mit ziemlicher Sicherheit während der morphologischen Analyse ausgewählt. Um auf der sicheren Seite zu sein, ändern Sie die Verbindungskosten aller Teile in `` `matrix.def``` auf 1, wodurch die Verbindungskosten des Kontexts definiert werden. Auf diese Weise können Sie "die Wortfragmente von Satzstück verbinden, ohne den Kontext zu berücksichtigen". Sie müssen sich nicht um den Kontext kümmern, daher kann die "Kontext-ID" alles sein. Dieses Mal wird die "Kontext-ID" auf "1" gesetzt.

"Wortfragment-ID" wurde "Teil der Wortunterkategorie 1" zugewiesen. "Wortfragment-ID" ist eine eindeutige ID, die ich der Ausgabe 8000 Wörter des Satzstücks gegeben habe (dh insgesamt 8000 IDs, Nummern 1 bis 8000 werden verwendet). Der "Teil des Wortes" von Satzstück ist "SPWORD". Dieser Teil des Wortes wird verwendet, um Wörter zu finden, die nicht durch Satzstück abgedeckt sind. Um es ein wenig zu erklären, basieren die Wortfragmente von Satzstück auf Trainingsdaten. Natürlich gibt es keine Möglichkeit, mit Zeichen umzugehen, die noch nie in den Trainingsdaten enthalten waren. Ich beschloss, den unbekannten Charakter mit dem herkömmlichen Kuromoji zu entdecken. (Ich denke, dass unbekannte Zeichen mit ziemlicher Sicherheit als "unbekannte Wörter" klassifiziert werden.) Wenn der Teiltext nicht "SPWORD" ist, wird die Wortfragment-ID auf "0" gesetzt. Dies kann mit unbekannten Zeichen umgehen.

3. Kompilieren Sie das gesamte Wörterbuch mit kuromoji.

Alles was Sie tun müssen, ist zu kompilieren. Kompiliere kuromoji wie gewohnt. Der in kuromoji enthaltene Testcode wird niemals bestanden. Löschen Sie also den Test.

Eigentlich verwenden

Die API ist unter [hier] verfügbar (https://apitore.com/store/apis/details?id=37). Informationen zur Vorbereitung von API-Aufrufen (API-Registrierung, Ausgabe von Zugriffstoken, Beispielausführung) finden Sie unter hier.

Spezifikationen wie die API-Eingabe / Ausgabe werden unter [hier] veröffentlicht (https://api.apitore.com/swagger?id=37). Wenn Sie es auch hier schreiben, sind die API-Antwortspezifikationen wie folgt. Die Eingabe ist Text.

{
  "endTime": "string",
  "log": "string",
  "processTime": "string",
  "startTime": "string",
  "tokens": [
    {
      "token": "string",
      "wid": 0
    }
  ]
}

Sehen wir uns ein aktuelles Anwendungsbeispiel an. Ich gab ein "Ich bin eine Katze. Ich habe noch keinen Namen." Sicherlich unterscheidet es sich ein wenig von der normalen morphologischen Analyse.

"tokens": [
  {
    "wid": 5578,
    "token": "ich"
  },
  {
    "wid": 5386,
    "token": "Mitarbeiter"
  },
  {
    "wid": 472,
    "token": "Ist"
  },
  {
    "wid": 5643,
    "token": "Katze"
  },
  {
    "wid": 11,
    "token": "Ist"
  },
  {
    "wid": 3796,
    "token": "。"
  },
  {
    "wid": 2002,
    "token": "Name"
  },
  {
    "wid": 472,
    "token": "Ist"
  },
  {
    "wid": 1914,
    "token": "noch"
  },
  {
    "wid": 26,
    "token": "Abwesend"
  },
  {
    "wid": 3796,
    "token": "。"
  }
]

Dann "WRYYYYYYYYYYY! Der höchste ist Aaaa". Es wurde in Stücke zerlegt.

"tokens": [
  {
    "wid": 829,
    "token": "W"
  },
  {
    "wid": 589,
    "token": "R"
  },
  {
    "wid": 3032,
    "token": "Y"
  },
  {
    "wid": 3032,
    "token": "Y"
  },
  {
    "wid": 3032,
    "token": "Y"
  },
  {
    "wid": 3032,
    "token": "Y"
  },
  {
    "wid": 3032,
    "token": "Y"
  },
  {
    "wid": 3032,
    "token": "Y"
  },
  {
    "wid": 3032,
    "token": "Y"
  },
  {
    "wid": 3032,
    "token": "Y"
  },
  {
    "wid": 3032,
    "token": "Y"
  },
  {
    "wid": 3032,
    "token": "Y"
  },
  {
    "wid": 0,
    "token": "!"
  },
  {
    "wid": 799,
    "token": "Beste"
  },
  {
    "wid": 2689,
    "token": "Zu"
  },
  {
    "wid": 646,
    "token": "Ja"
  },
  {
    "wid": 9,
    "token": "Was"
  },
  {
    "wid": 3880,
    "token": "Oder"
  },
  {
    "wid": 3888,
    "token": "Einer"
  },
  {
    "wid": 3914,
    "token": "Ist"
  },
  {
    "wid": 1726,
    "token": "EIN"
  },
  {
    "wid": 1726,
    "token": "EIN"
  },
  {
    "wid": 1726,
    "token": "EIN"
  }
]

Geben Sie schließlich "Angst überwinden" bedeutet "leben". Es ist ein sehr charakteristisches Segment.

"tokens": [
  {
    "wid": 648,
    "token": "「"
  },
  {
    "wid": 5092,
    "token": "Unheimlich"
  },
  {
    "wid": 5725,
    "token": "Unheimlich"
  },
  {
    "wid": 3846,
    "token": "」"
  },
  {
    "wid": 2163,
    "token": "Zu"
  },
  {
    "wid": 5711,
    "token": "Katsu"
  },
  {
    "wid": 4840,
    "token": "Kleider"
  },
  {
    "wid": 543,
    "token": "Machen"
  },
  {
    "wid": 648,
    "token": "「"
  },
  {
    "wid": 2859,
    "token": "Leben"
  },
  {
    "wid": 3798,
    "token": "Ru"
  },
  {
    "wid": 3846,
    "token": "」"
  },
  {
    "wid": 12,
    "token": "Ding"
  }
]

abschließend

Ich habe Satzstück auf [Web-API] gesetzt (https://apitore.com/store/apis/details?id=37). Es scheint Mochiron zu sein, um es in der Übersetzung zu verwenden, und da es für sec2sec verwendet werden kann, scheint es, dass auch eine Standardkonvertierung von Sprachwörterbüchern durchgeführt werden kann. Ich denke darüber nach, es für die Beurteilung der Polarität zu verwenden. Im Moment mache ich RNN + LSTM für Word2Vec-Ergebnisse, aber ist RNN + LSTM nicht etwas Gutes, um einen One-Hot-Vektor mit den Wortfragmenten von Satzstück zu erstellen?

Recommended Posts

Es wurde eine API veröffentlicht, die Satzstücke wie morphologische Analysen verwenden kann
Fortsetzung - Veröffentlichung einer Web-API, die Satzstücke wie morphologische Analysen verwenden kann
Morphologische Analyse in Java mit Kuromoji
NLP4J Morphologische Analyse in Java (unter Verwendung von Kuromoji)
Erhalten Sie detaillierte Ergebnisse der morphologischen Analyse mit Apache Solr 7.6 + SolrJ (Japanisch)
Es wurde eine API veröffentlicht, die Satzstücke wie morphologische Analysen verwenden kann
Ich habe eine morphologische Analyse mit MeCab versucht
Fortsetzung - Veröffentlichung einer Web-API, die Satzstücke wie morphologische Analysen verwenden kann