[JAVA] Wie man eine hybride Suche mit morphologischer Analyse und Ngram mit Solr realisiert

Dieser Artikel wurde auch auf VASILY DEVELOPERS BLOG mit demselben Inhalt veröffentlicht. Bitte lesen Sie andere Artikel, wenn Sie möchten.

Hallo, das ist Shiozaki von den Backend-Ingenieuren. Bisher verwendete der iQON-Index für die Volltextsuche nur morphologische Analysen, aber neulich haben wir die Suche auch mit Ngram verbessert. Infolgedessen hat sich die Anzahl der Treffer in den Suchergebnissen verbessert, und die Zunahme des Suchrauschens wurde auf ein geringes Maß unterdrückt.

In diesem Artikel werde ich die Vorteile der gemeinsamen Verwendung von Ngram und die Verwendung mit Apache Solr vorstellen.

Ich kann die gewünschten Informationen nicht finden

Wie ist der Zustand "Suchen, aber nicht Finden der gewünschten Informationen"? Lassen Sie uns diesen Zustand in die folgenden zwei Zustände aufteilen.

Die Menge an Informationen, die ich möchte, ist gering

Der erste Status lautet "Die gewünschten Informationen sind weniger in den Suchergebnissen enthalten". Wenn Sie beispielsweise auf einer Reiseinformationsseite nach "Tokio" suchen, enthält die Datenbank Tausende von Daten, aber nur wenige Suchergebnisse.

スクリーンショット 2017-02-15 20.26.09.png

Viele Informationen, die Sie nicht wollen

Der zweite Status lautet "Es gibt viele unerwünschte Informationen in den Suchergebnissen". Wenn Sie nach "Tokio" suchen, enthalten die Suchergebnisse neben Informationen zu Tokio auch Informationen zu anderen Bereichen wie Kyoto und Osaka.

スクリーンショット 2017-02-15 20.26.46.png

Tatsächlich passieren zwei Zustände gleichzeitig

In vielen Fällen treten die beiden oben genannten Zustände gleichzeitig auf, wenn Sie nicht finden können, was Sie wirklich wollen. Mit anderen Worten, nicht alle Informationen, die der Benutzer möchte, werden als Suchergebnis zurückgegeben, und die Informationen, die der Benutzer nicht möchte, werden auch als Suchergebnis zurückgegeben.

Das Ben-Diagramm sieht wie folgt aus. Alle in der Datenbank gespeicherten Informationen werden nach den beiden Achsen klassifiziert, ob sie als Suchergebnis zurückgegeben wurden und ob es sich um die gewünschten Informationen handelte.

スクリーンショット 2017-02-15 18.26.25.png

Geben Sie dann jedem Satz einen Namen zur weiteren Erläuterung. "Richtiges Ergebnis" wird als Suchergebnis zurückgegeben und die vom Benutzer angeforderten Informationen werden als Suchergebnis zurückgegeben, aber "Suchrauschen" wird als die vom Benutzer nicht angeforderten Informationen zurückgegeben. Informationen, die nicht in den Ergebnissen enthalten sind, werden als "fehlende Suche" bezeichnet.

Im Bereich des Informationsabrufs werden sie übrigens als "True Positive", "Flase Positive" bzw. "False Negative" bezeichnet.

In dieser Figur entspricht der Zustand mit vielen Suchauslassungen dem oben erläuterten ersten Zustand, und der Zustand mit vielen Suchgeräuschen entspricht dem zweiten Zustand. Das Verbessern der Suchergebnisse ist nichts anderes als das Reduzieren der Anzahl von Suchgeräuschen und Auslassungen und das Abgleichen der Suchergebnisse mit den gewünschten Informationen.

Das Reduzieren dieser beiden ist jedoch ein Kompromiss. Oft wird die Verbesserung des einen das andere verschlimmern.

Arten von Suchindizes und ihre Vor- und Nachteile

In diesem Abschnitt werden die in der Volltextsuchmaschine durchgeführte Indexverarbeitung und die zuvor durchgeführte Wortzerlegung beschrieben. Die Volltextsuchmaschine erstellt einen Index, der als transponierter Index bezeichnet wird, um den Suchprozess zu beschleunigen. Der Translokationsindex ist ein assoziatives Array, dessen Schlüssel ein Wort in einem Satz ist, und der Wert ist das Array von Dokumenten, in denen das Wort vorkommt.

Dieser Bereich wird in der ersten Hälfte des neulich veröffentlichten TECH BLOG-Artikels ausführlich erläutert. Schauen Sie also bitte vorbei. http://tech.vasily.jp/entry/solr6-neologd

Um einen transponierten Index zu generieren, muss das Dokument in Wörter zerlegt werden. Es gibt zwei Methoden zur Wortzerlegung, z. B. Japanisch, bei denen Wörter nicht durch Leerzeichen getrennt sind: Ngram und morphologische Analyse.

Ich werde jede Funktion erklären.

Ngram Ngram ist eine Methode, um Sätze mechanisch in N Zeichen zu unterteilen und in Wörter zu zerlegen. Der N-Teil ändert sich abhängig davon, wie viele Zeichen getrennt sind, und wird auch als Bigram bezeichnet, wenn N = 2 und Trigramm, wenn N = 3. Von nun an wird N = 2 (Bigram) zur Erklärung verwendet.

bigram trennt das Dokument durch zwei Zeichen und betrachtet das Ergebnis als Wort. Zum Beispiel ist das Dokument "Tokyo Metropolitan Museum of Art" in die folgenden fünf Wörter unterteilt.

"Tokio" "Kyoto" "Tomi" "Kunst" "Kunstmuseum"

Wenn Sie dann eine Suche durchführen, wird die Suchabfrage auf ähnliche Weise in Wörter aufgeteilt und mit ihrem UND kombiniert. Suchen Sie beispielsweise für die Suchabfrage "Museum" unter der Bedingung "Kunst UND Kunstmuseum".

Der Vorteil von Ngram besteht darin, dass dies garantiert, dass keine Teilzeichenfolge mit N Zeichen oder mehr ausgelassen wird. Andererseits ist der Nachteil von Ngram, dass dieses "Tokyo Metropolitan Museum of Art" selbst für die Suchanfrage "Kyoto" getroffen wird.

Vorteile: Garantierte teilweise Übereinstimmungssuche Nachteile: Hohes Suchrauschen

Morphologische Analyse

Für die Wortteilung durch morphologische Analyse wird die Wortteilung in grammatikalisch bedeutsamen Einheiten unter Verwendung eines zuvor erstellten Wörterbuchs durchgeführt. Daher besteht der Vorteil darin, dass Probleme bei der Verwendung von Ngram wahrscheinlich nicht auftreten.

Andererseits ist es notwendig, ein Wörterbuch im Voraus vorzubereiten, und wenn die Leistung des Wörterbuchs niedrig ist, verschlechtert sich die Suchleistung. Wenn Sie beispielsweise "ausländische Regierung" in "ausländische", "Karotte" und "Regierung" aufteilen, wird das Dokument nicht in der Suchabfrage "Regierung" angezeigt.

Darüber hinaus verwendet kuromoji, ein in Solr und Elastic Search standardmäßig installierter morphologischer Analysator, ein IPA-Wörterbuch. Dieses Wörterbuch weist jedoch eine Schwäche auf, die nicht so stark gegen die richtige Nomenklatur in einem bestimmten Bereich ist. Infolgedessen wird die richtige Nomenklatur, die ursprünglich ein Wort sein sollte, häufig in mehrere Wörter unterteilt. Beispiel: "Rokushitan" → "Roku" "Shitan"

Andererseits gibt es ein anderes Problem bei der Verwendung einer richtigen Nomenklatur als ein Wort. Wenn Sie beispielsweise die richtige Nomenklatur "Kansai International Airport" als ein einziges Wort indizieren, werden Dokumente mit "Kansai International Airport" in Suchanfragen wie "International Airport" und "Airport" nicht berücksichtigt. Um dieses Problem zu lösen, hat Kuromoji die Funktion, das Wort "Kansai International Airport" weiter zu unterteilen und insgesamt 4 Wörter zu indizieren, einschließlich der 3 Wörter "Kansai", "International" und "Airport". Ein solches Verhalten hängt jedoch auch vom Wörterbuch und dem morphologischen Analysator ab, und es gibt keine Garantie dafür, dass eine teilweise Übereinstimmungssuche möglich ist.

Vorteile: Geringes Suchrauschen Nachteil: Abhängig von der Leistung des Wörterbuchs gibt es viele Suchauslassungen

Kombinierte morphologische Analyse und Ngram

Die Vor- und Nachteile von Ngram und morphologischer Analyse sind in der folgenden Tabelle in Bezug auf die Anzahl der Suchgeräusche und die Anzahl der Suchauslassungen zusammengefasst.

Suchrauschen Suchauslassung
Ngram Viele Wenige
Morphologische Analyse Wenige Viele

Diese Abbildung zeigt auch, dass es einen Kompromiss zwischen der Reduzierung des Suchrauschens und der Reduzierung von Suchauslassungen gibt.

Durch die Verwendung dieser beiden zusammen ist es jedoch möglich, die Anzahl der Suchauslassungen und die Anzahl der Suchgeräusche im Vergleich zu dem Fall, in dem jedes für sich allein verwendet wird, erheblich zu reduzieren.

Die spezifische Methode, um sie zusammen zu verwenden, ist wie folgt.

** Indexerstellungsprozess **

  1. Generieren Sie einen Ngram-Index für Ihr Dokument
  2. Generieren Sie einen Index durch morphologische Analyse

** Suchvorgang **

  1. Suchen Sie gleichzeitig nach Ngram und Index durch morphologische Analyse
  2. Führen Sie die Suchergebnisse mit Gewichten zusammen, sodass die Indexergebnisse der morphologischen Analyse wahrscheinlich ganz oben stehen.

スクリーンショット 2017-02-15 20.49.32.png

Reduzieren Sie Suchauslassungen, indem Sie zwei Suchergebnisse zusammenführen. Durch einfaches Zusammenführen wird jedoch das Suchrauschen erhöht. Der Schlüssel zu dieser kombinierten Verarbeitung besteht darin, die Ergebnisse der morphologischen Analyse so zusammenzuführen, dass sie wahrscheinlich am Anfang stehen. Wenn Benutzer Suchergebnisse anzeigen, beginnen sie von vorne. Wenn sie also zu Beginn Informationen wünschen, sind sie möglicherweise zufrieden und hören auf, nachfolgende Ergebnisse anzuzeigen. In solchen Fällen kann davon ausgegangen werden, dass das Suchrauschen nicht wesentlich zugenommen hat.

So erstellen Sie mit Solr eine Abfrage, bei der morphologische Analyse und Ngram zusammen verwendet werden

Erklärt, wie eine bestimmte Solr-Einstellungsdatei geschrieben und eine Abfrage geschrieben wird.

Ich habe dieses Verhalten in Solr 6.2.1 bestätigt, aber ich schreibe nicht in einer bestimmten Version, daher denke ich, dass es in anderen Versionen von Solr funktionieren wird.

Indexgenerierungsmethode

Erstens ist der Teil der Indexgenerierung. Schreiben Sie die folgenden drei Informationen in das verwaltete Schema.

Feldtypdefinition

Es definiert text_ja_ngram, einen Feldtyp für die Indexgenerierung in Ngram, und text_ja, ein Feld für die Indexgenerierung in der morphologischen Analyse.

<fieldType name="text_ja_ngram" class="solr.TextField" autoGeneratePhraseQueries="true" positionIncrementGap="100">
  <analyzer>
    <charFilter class="solr.ICUNormalizer2CharFilterFactory" name="nfkc"/>
    <tokenizer class="solr.NGramTokenizerFactory" minGramSize="2" maxGramSize="2"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

<fieldType name="text_ja" class="solr.TextField" autoGeneratePhraseQueries="false" positionIncrementGap="100">
  <analyzer>
    <charFilter class="solr.ICUNormalizer2CharFilterFactory" name="nfkc"/>
    <tokenizer class="solr.JapaneseTokenizerFactory" mode="search" userDictionary="lang/userdict_ja.txt"/>
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.JapaneseBaseFormFilterFactory"/>
    <filter class="solr.JapanesePartOfSpeechStopFilterFactory" tags="lang/stoptags_ja.txt"/>
    <filter class="solr.StopFilterFactory" words="lang/stopwords_ja.txt" ignoreCase="true"/>
    <filter class="solr.JapaneseKatakanaStemFilterFactory" minimumLength="4"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

Felddefinition

Definieren Sie dann die Felder für diese Feldtypen.

<field name="search_ngram" type="text_ja_ngram" multiValued="true" indexed="true" required="false" stored="true"/>
<field name="search" type="text_ja" multiValued="true" indexed="true" required="false" stored="true"/>

Daten aus anderen Feldern kopieren

Verwenden Sie schließlich copyField, um das zu durchsuchende Feld in die beiden oben genannten Felder zu kopieren.

<copyField source="title" dest="search_ngram" />
<copyField source="title" dest="search" />
<copyField source="description" dest="search_ngram" />
<copyField source="description" dest="search" />
...

Damit ist die Einstellung des Indexgenerierungsteils abgeschlossen. Versuchen wir zu bestätigen, dass diese mit der Analysefunktion ordnungsgemäß funktionieren.

スクリーンショット 2017-02-13 20.30.23.png

So werfen Sie eine Abfrage

Das Folgende ist eine Abfrage, die für diese Felder ausgegeben werden soll.

Verwenden Sie die eDisMax-Abfrage, um mehrere Felder zu durchsuchen. Sie können mit beiden Feldern suchen, indem Sie die folgenden Parameter abfragen.

Die durch qf angegebenen 100 und 50 sind die Gewichte der jeweiligen Felder. Je höher das Gewicht, desto einfacher ist es, dass das Dokument, das auf dieses Feld trifft, zuerst angezeigt wird. Um sich hier umzuschalten, muss der Wert geändert werden, während die Suchergebnisse angezeigt werden.

Zusammenfassung

Durch die gemeinsame Verwendung von morphologischer Analyse und Ngram konnten wir Suchauslassungen reduzieren und die Zunahme des Suchrauschens unterdrücken. Infolgedessen hat iQON die Suche nach Produkten mit der Abkürzung des Markennamens ermöglicht. Beispielsweise können Sie jetzt das Produkt "JIMMY CHOO" mit der Suchabfrage "JIMMY" aufrufen.

Recommended Posts

Wie man eine hybride Suche mit morphologischer Analyse und Ngram mit Solr realisiert
Wie kann ich mit NUXTJS Official S3 und CloudFront für AWS bereitstellen? Mit Docker-Compose
So geben Sie Excel und PDF mit Excella aus
Ausführen einer Methode und Verspotten mit JUnit
Wie man Stimme oder Musik mit Javascript spielt
So erstellen Sie eine API mit GraphQL und Rails
[Docker] Wie man mit einem Container in Heroku aktualisiert und wie man mit Migrate Error umgeht
So führen Sie mit RxAndroid einen Komponententest mit JVM an einer Quelle durch
So serialisieren und deserialisieren Sie den LocalDateTime-Typ mit GSON
So konvertieren Sie A in a und a in A mit logischem Produkt und Summe in Java
So installieren Sie Gradle und Kotlin mit SDKMAN (Mac)
Testen des Einschlusses von Bildern bei Verwendung von ActiveStorage und Faker
Festlegen von Umgebungsvariablen bei Verwendung von Payjp mit Rails
So transformieren Sie ARKit- und SceneKit-Figuren mit Metal Shader
Festlegen und Beschreiben von Umgebungsvariablen mit Rails zsh
So erstellen Sie eine App mit Tensorflow mit Android Studio
So verbinden Sie eine Tabelle ohne DBFlute und SQL
Erhalten Sie detaillierte Ergebnisse der morphologischen Analyse mit Apache Solr 7.6 + SolrJ
Erste Schritte mit JDBC mit PostgresSQL unter MacOS
So registrieren Sie sich mit Tomcat als Kunde in Square
Umgang mit verschiedenen Versionen von rbenv und Ruby
Wie man mit html.erb nummeriert (nummeriert)
So aktualisieren Sie mit activerecord-import
So autorisieren Sie mit graphql-ruby
Erhalten Sie detaillierte Ergebnisse der morphologischen Analyse mit Apache Solr 7.6 + SolrJ (Japanisch)
So realisieren Sie mit TERASOLUNA 5.x (= Spring MVC) das Hochladen großer Dateien
Wie POST JSON in Java-Methode mit OkHttp3 und Methode mit HttpUrlConnection-
[Rails] Wie man Kaminari mit Slim einführt und das Design ändert
Informationen zu TestSize, das von Google empfohlen wird, und zur Realisierung von TestSize durch Java und Maven
[Tipps] So lösen Sie Probleme mit XCode und Swift für Anfänger
[Rails] So laden Sie Bilder mit Carrierwave und Fog-Aws in AWS S3 hoch
[Rails] So laden Sie Bilder mit refile und refile-s3 in AWS S3 hoch
So erzielen Sie mit Rest Template of Spring einen großen Datei-Upload
[Ruby on Rails] So melden Sie sich nur mit Ihrem Namen und Passwort mit dem Gem-Gerät an