Heim > Backend-Entwicklung > Python-Tutorial > Erstellen Sie eine Hochgeschwindigkeits-Abruf-Engine mit Python und Xapian

Erstellen Sie eine Hochgeschwindigkeits-Abruf-Engine mit Python und Xapian

高洛峰
Freigeben: 2016-10-18 10:03:17
Original
1249 Leute haben es durchsucht

Verstehen Sie zunächst einige Konzepte: Dokumente, Begriffe und Veröffentlichung. Beim Information Retrieval (IR) wird das Element, das wir abrufen möchten, als „Dokument“ bezeichnet, und jedes Dokument wird durch eine Reihe von Begriffen beschrieben. Die beiden Wörter „Dokument“ und „Begriff“ sind Begriffe im IR, die aus „Bibliotheksverwaltung“ stammen. Normalerweise wird ein Dokument als ein Stück Text betrachtet, höchstwahrscheinlich in maschinenlesbarer Form, und ein Begriff ist ein Wort oder eine Phrase, die zur Beschreibung des Dokuments verwendet wird. In der Regel enthält das Dokument mehrere Begriffe. Wenn sich ein Dokument auf _orale_ _Hygiene_ bezieht, dann können folgende Begriffe vorkommen: „Zahn“, „Zähne“, „Zahnbürste“, „Karies“, „Karies“, „Plaque“ oder „Diät“ usw.

Wenn es in einem IR-System ein Dokument namens D gibt und dieses Dokument durch einen Begriff namens t beschrieben wird, dann wird t als Index D betrachtet, der durch die folgende Formel ausgedrückt werden kann: t- > D. In einer tatsächlichen Anwendung ist ein IR-System normalerweise eine Sammlung mehrerer Dokumente wie D1, D2, D3 ... und eine Sammlung mehrerer Begriffe wie t1, t2, t3 ..., also gibt es Folgendes Beziehung: ti -> Dj.

Wenn ein bestimmter Begriff ein bestimmtes Dokument indiziert, wird dies als „Posting“ bezeichnet. Vereinfacht ausgedrückt handelt es sich bei „Posting“ um einen Begriff mit Positionsinformationen, der bestimmte Verwendungszwecke bei der Relevanzabfrage haben kann.

Gegeben ein Dokument namens D, gibt es eine Begriffsliste, die es indiziert, die wir Ds Begriffsliste nennen.

Bei einem gegebenen Begriff mit dem Namen t wird eine Liste von Dokumenten indiziert, die als Posting-Liste von t bezeichnet wird (die Verwendung von „Dokumentenliste“ ist möglicherweise konsistenter bei der Benennung, klingt aber zu vage).

In einem IR-System, das auf einem Computer vorhanden ist, werden Begriffe in Indexdateien gespeichert. Der Begriff kann verwendet werden, um seine Posting-Liste effektiv zu durchsuchen. In der Posting-Liste verfügt jedes Dokument über eine kurze Kennung, die Dokument-ID. Einfach ausgedrückt kann man sich eine Posting-Liste als eine Sammlung von Dokument-IDs vorstellen, während eine Begriffsliste eine Sammlung von Strings ist. Einige IR-Systeme verwenden Zahlen, um Begriffe intern darzustellen. In diesen Systemen ist die Begriffsliste also eine Sammlung von Zahlen. Dies ist bei Xapian nicht der Fall. Es werden Originalbegriffe verwendet, um den Speicherplatz zu komprimieren.

Begriffe müssen nicht unbedingt Wörter sein, die im Dokument vorkommen. Normalerweise werden sie in Kleinbuchstaben umgewandelt und häufig vom Stammalgorithmus verarbeitet, sodass sie über einen Begriff mit dem Wert „ abgerufen werden können. „connect“ Eine Reihe von Wörtern wie „connect“, „connects“, „connection“ oder „connected“ usw., und ein Wort kann auch mehrere Begriffe ergeben. Sie indizieren beispielsweise sowohl die extrahierten als auch die nicht extrahierten Stämme Worte. Steh auf. Dies gilt natürlich nur für europäische und amerikanische Sprachen wie Englisch, Französisch oder Latein, während chinesische Partizipien sehr unterschiedlich sind. Im Allgemeinen weisen die Partizipien europäischer und amerikanischer Sprachen die folgenden Unterschiede zu chinesischen Partizipien auf:

l. Normalerweise wird jedes Wort im Englischen durch Leerzeichen getrennt, aber das ist im Chinesischen nicht der Fall. Es kann sogar so extrem sein, dass es im Ganzen keine Leerzeichen oder Satzzeichen gibt Artikel. 2. Wie oben erwähnt bedeuten „verbinden“, „verbindet“, „Verbindung“ bzw. „verbunden“ jeweils „Verbindung der Verbnatur“, „Verbindung der dritten Person der Verbnatur“, „Verbindung der Namensnatur“ oder „die“. „Vergangenheitsform der Verbindung“, aber im Chinesischen kann „Verbindung“ verwendet werden, um alles auszudrücken, und es ist fast kein Wortstamm erforderlich. Das bedeutet, dass die meisten verschiedenen Wortarten im Englischen auf Regeln basieren, während die chinesischen Wortarten wild und uneingeschränkt sind. 3. Der zweite Punkt ist nur ein Mikrokosmos der Schwierigkeit der chinesischen Wortsegmentierung. Es ist sehr schwierig, die semantische Bedeutung eines Satzes vollständig und korrekt zu identifizieren Man kann zwischen „China“ und „Chinesisch“, „Volk“, „Republik“, „gegründet“ und anderen Wörtern unterscheiden, aber „Chinesisch“ unter ihnen hat eigentlich wenig mit diesem Satz zu tun. Auf den ersten Blick scheint es einfach, aber wie kann eine Maschine die Geheimnisse so leicht verstehen?

Werte

Werte sind eine Art Metadaten, die an das Dokument angehängt sind. Jedes Dokument kann mehrere Werte haben, und diese Werte werden durch unterschiedliche Nummern identifiziert. Die Werte sind so konzipiert, dass während des Abgleichvorgangs schnell auf sie zugegriffen werden kann. Sie können für Zwecke wie Sortieren, Einreihen redundanter doppelter Dokumente und Bereichsabruf verwendet werden. Obwohl es keine Längenbeschränkung für Werte gibt, ist es am besten, sie so kurz wie möglich zu halten. Wenn Sie nur ein Feld zur Anzeige als Ergebnis speichern möchten, wird empfohlen, diese in den Daten des Dokuments zu speichern.

Dokumentdaten

Jedes Dokument hat nur ein Datum, das Daten in jedem beliebigen Format sein kann. Bitte konvertieren Sie diese beim Speichern zunächst in eine Zeichenfolge. Das mag etwas seltsam klingen, aber die Realität sieht so aus: Wenn die zu speichernden Daten im Textformat vorliegen, können sie direkt gespeichert werden. Wenn es sich bei den zu speichernden Daten um verschiedene Objekte handelt, serialisieren Sie sie bitte zuerst in einen Binärstream Speichern Sie es und lesen Sie es dann beim Deserialisieren und Lesen.

Posting

Posting ist ein Begriff mit Position. Nachdem

# -*- coding: gb18030 -*-
import xapian
testdatas = [u'abc test python1',u'abcd testing python2']
def buildtest():
    database = xapian.WritableDatabase('indexes/', xapian.DB_CREATE_OR_OPEN)
    stemmer = xapian.Stem("english")
    for data in testdatas:
        doc = xapian.Document()
        doc.set_data(data)
        for term in data.split():
            doc.add_term(term)
        database.add_document(doc)
if __name__ == '__main__':
    buildtest()
Nach dem Login kopieren

ausgeführt wurde, wird eine Indexbibliothek im aktuellen Verzeichnis generiert.

[sh]

[ec2-user@ip-10-167-6-221 indexes]$ ll

Gesamtnutzung 52

-rw-rw-r-- 1 ec2-user ec2-user 0 28. Juli 16:06 flintlock

-rw-rw-r-- 1 ec2-user ec2-user 28 28. Juli 16 :06 iamchert

-rw-rw-r-- 1 ec2-user ec2-user 13. 28. Juli 16:06 postlist.baseA

-rw-rw-r-- 1 ec2- Benutzer ec2-user 14 28. Juli 16:06 postlist.baseB

-rw-rw-r-- 1 ec2-user ec2-user 8192 28. Juli 16:06 postlist.DB

- rw-rw-r-- 1 ec2-user ec2-user 13 28. Juli 16:06 record.baseA

-rw-rw-r-- 1 ec2-user ec2-user 14 28. Juli 16:06 record.baseB

-rw-rw-r-- 1 ec2-user ec2-user 8192 28. Juli 16:06 record.DB

-rw- rw-r-- 1 ec2- Benutzer ec2-user 13. 28. Juli 16:06 termlist.baseA

-rw-rw-r-- 1 ec2-user ec2-user 14. 28. Juli 16:06 termlist.baseB

- rw-rw-r-- 1 ec2-user ec2-user 8192 28. Juli 16:06 termlist.DB

Wir werden im nächsten Artikel vorstellen, wie man den Index abfragt.


Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage