grosstokarczyk volltextsuche mit lucene lupy -...
TRANSCRIPT
Ruprecht-Karls-Universität HeidelbergSeminar für ComputerlinguistikHS: Information RetrievalPD Dr. Karin HaeneltWS 2006/07
Volltextsuche mit Lucene & Lupy
Enikö Gross
Alina Tokarczyk
22.01.2007
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Inhalt� Lucene
� Was ist Lucene?� Aufbau des Pakets / Übersicht der Funktionen� Lucene-Ablauf
� Lupy� Was ist Lupy?� Aufbau von Lupy-API� Anwendung von Lupy
� Evaluierung� Ziel des Experiments� Textkorpus und Beispieltext� Queries� Suchergebnisse� Sonderfälle
� Zusammenfassung� Softwaresysteme, die Lucene benutzen� Literatur
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Was ist Lucene?
� Lucene ist eine open-source Quellcode-Bibliothek für Textsuchmaschinen
� programmiert in Java� leistungsstark (schnell, effizient)� enthält umfangreiche Funktionen� zur Implementierung einer großen Textsuchmaschine geeignet
(API - engl. application programming interface, dt. Schnittstelle zur Anwendungsprogrammierung)
� Realisierung der Volltextsuche erfolgt in zwei Hauptschritten: der Indexierung und der Suche
� http://lucene.apache.org/java/docs/� Die aktuelle Version: Lucene 2.0.0
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Lucene-Entwicklung
� Im Rahmen der Apache Software Foundation (ASF) wurde das Jakarta Projekt (Implementierungen Java-Anwendungen) angefangen
� Lucene ist ein Teil des Jakarta Projekts und wird seit1997 entwickelt
� Der Begründer von Lucene ist Doug Cutting
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Lucene Packages
� Lucene enthält die folgenden packages:� analysis� document� index� queryParser� search� store� util
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Klassen in ‘analysis‘ � Analyzer.class� CharStream.class� CharTokenizer.class� FastcharStream.class� ISOLatin1AccentFilter.class� KeywordAnalyzer.class� KeywordTokeniyer.class� LengthFilter.class� LetterTokenizer.class� LowerCaseFilter.class� LowerCaseTokenizer.class� ParseException.class� PerFieldAnalyzerWrapper.class� PorterStemFilter.class� PorterStemmer.class� SimpleAnalzyer.class
� StandardAnalyzer.class� StandardFilter.class� StandardTokenizer.class� StandardTokenizerConstatnts.class� StandardTokenizerTokenManager.cl
ass� StopAnalyzer.class� StopFilter.class� Token.class� TokenFilter.class� Tokenizer.class� TokenMgrError.class� TokenStream.class� WhitespacAnalyzer.class� WhitespaceTokenizer.class� WordlistLoader.class
unterstrichene Klassensind in Lupy in Python portiert
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Klassen in ‘index‘� CompoundFileReader.class� CompoundFileWriters.class� DocumentWriter.class� FieldInfo.class� FieldInfos.class� FiledsReader.class� FieldsWriter.class� FilterIndexReader.class� IndexFileNameFilter.class� IndexFileNames.class� IndexModifier.class� IndexReader.class� IndexWriter.class� MultipleTermPosition.class� MultiReader.class� MultiTermDocs.class� MultiTermEnum.class� MultiTermPositions.class� ParallelReader.class� Posting.class� SegmentInfo.class� SegmentInfos.class
� SegmentMergeInfo.class� SegmentMergeQueue.class� SegmentMerger.class� SegmentReader.class� SegmentTermDocs.class� SegmentTermEnum.class� SegmentTermPositions.class� SegmentTermPositionVector.class� SegmentTermVector.class� Term.class� TermBuffer.class� TermDocs.class� TermEnum.class� TermFreqVector.class� TermInfo.class� TermInfosReader.class� TermInfosWriter.class� TermPostions.class� TermPostitionVector.class� TermVectorOffsetInfo.class� TermVectorsReader.class� TermVectorWriter.class
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Einige Klassen in package ‘search‘� WildTermEnum.class� BooleanClause.class� BooleanQuery.class� BooleanScorer.class� ConjunctionScorer.class� DefaultSimilarity.class� DisjunctionMaxQuery.class� DicjunctionMaxScorer.class� ExactPhraseScorer.class� Explanation.class� FieldCache.class� FieldDoc.class� FieldDocSortedHitQueue.class� FieldSortedHitQueue.class� Filter.class� FilteredQuery.class� FilteredTermEnum.class� FuzzyQuery.class� FuzzyTermEnum.class� HitDoc.class� HitQueue.class� Hits.class� IndexSearcher.class� MatchAllDocsQuery.class
� MutliPhraseQuery.class� MultiSearcher.class� MultiTermQuery.class� ParallelMultiSearcher.class � PhrasePositions.class� PhraseQuery.class � PhraseScorer.class � PrefixQuery.class � Query.class � QueryFilter.class � QueryTermVector.class � RangeQuery.class� ScoreDoc.class� Scorer.class� Searcher.class� Similarity.class� Sort.class� SortComarator.class� SortField.class� TermQuery.class� TermScorer.class� TopDoc.class� TopFieldDocs.class� Weight.class� WildcardQuery.class
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Grafische Darstellung von Klassen (Scoring)
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Lucene – weitere Projekte
� Projekte in der Entwicklungsphase:
� Snowball Stemmers for Lucene (Wortstammreduktion)
� Lucene WordNet (Synonymsuche; verwendet WordNet-Prologdateien)
� …
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Gesamtablauf von Lucene
Schumann, Lucene. Volltextsuche mit Java (2006)
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Gesamtablauf einer Lucene-Anwendung
� Indexerstellung � ein Suchraum (Textkorpus) wird definiert und aufbereitet� Normalisierung – die Datenmenge wird mit Hilfe von
Analyzer reduziert� Indexierung wird durchgeführt
INDEX MIT DOKUMENEN
� Eine Anfrage wird gestellt und mittels QueryParserbearbeitet
QUERY
� Index wird gemäß Query durchgesucht� Ergebnisse (Hits) können nach Relevanz sortiert
werden
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Lucene - Indexerstellung� Das Textkorpus wird in Token zerlegt und mit Hilfe eines
Analyzers normalisiert:
� StandardAnalyzer : ein hoch entwickelter Mehrzweckanalyzer� WhitespaceAnalyzer : ein einfacher Analyzer, der die Tokens
mittels Lehrstellen aufteilt� StopAnalyzer : entfernt die englischen Stoppwörter� SnowballAnalyzer : reduziert die Wörter auf ihren Wortstamm
(z.B. gesuchtes "rain" gibt auch "raining", "rained", etc... aus) � GermanAnalyzer, RussianAnalyzer, FrenchAnalyzer, etc. – ein
für die jeweiligen Sprachen geeigneter Analyzer
� Die Dokument-Objekte (documents) werden durch Hinzufügen der Felder (fields) erstellt (Klasse Document)
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Lucene - Indexstruktur� Ein Index besteht aus einer Sequenz
von Lucene-Dokumenten (documents)
� Jedes Dateiformat (HTML, XML, Word, PDF etc.) kann in ein Dokument umgewandelt werden
� Jedes Dokument besteht aus mindestens einem oder mehreren Feldern (fields), die mit Hilfe von FileDocument hinzugefügt wurden.
� Ein Feld besitzt einen Namen und einen Wert
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Lucene – Indexstruktur (Fields)� In Lucene gibt es vier Feld-Typen (Werte):
� UnIndexed Feld wird im Index gespeichert (stored) aber nicht in der Suche verwendet
� Keyword Feld wird gespeichert (stored) und indexiert (indexed) (Keyword ist ein String oder eine Datei)
� Text Feld wird analysiert (tokenized), indexiert und im Index gespeichert (stored)
� UnStored Feld-Wert wird analysiert (tokenized) und indexiert, aber nicht im Index gespeichert
� Eigenschaften von Field:� stored – Text wird im Index wörtlich (literally) gespeichert� indexed – invertierte Felder� tokenized – Text im Feld wird tokenisiert, um die entstandenen Terme
zu indexieren
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Lucene - Indexierung
� IndexWriter erstellt einen Index und fügt die neuen Dokumente in den Index mit Hilfe der Funktion addDocument() hinzu
� Mittels IndexReader kann man auf die Daten im Index zugreifen
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Lucene – Beispiel der IndexierungAnalyzer analyzer = new StandardAnalyzer();// Store the index in memory:
Directory directory = new RAMDirectory();// To store an index on disk, use this instead (note that the// parameter true will overwrite the index in that directory// if one exists)://Directory directory = FSDirectory.getDirectory("/tmp/testindex", true);
IndexWriter iwriter = new IndexWriter(directory, analyzer, true);
iwriter.setMaxFieldLength(25000);Document doc = new Document();String text = "This is the text to be indexed.";doc.add(new Field("fieldname", text, Field.Store.YES,
Field.Index.TOKENIZED));iwriter.addDocument(doc);iwriter.close();
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Lucene - Suche� Searcher wird mit zwei Parametern aufgerufen:
� Directory, wo der Index liegt� Suchanfrage
� QueryParser erstellt ein Query-Objekt aus einem String (Suchanfrage)
� Die Volltextsuche wird mittels IndexSearcherdurchgeführt.
� Output: eine Rangliste von gefundenen Dokumenten wird in Hits gespeichert; die Suchergebnisse werden für den Benutzer ausgegeben
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Lucene - Suche
� Lucene bietet Datenstrukturen für verschiedene Formen der Query:
� TermQuery für einzelne Begriffe (TermQuery verbindet die Dokumente, die den gesuchten Begriff beinhalten)
� PhraseQuery für Phrasen (PhraseQuery verbindet die Dokumente, die eine bestimmte Sequenz der Suchbegriffe in derselben Reihenfolge beinhalten)
� BooleanQuery für Ausdrücke, in denen die Suchbegriffe mit Booleschen Operatoren (and, or, not) verbunden worden sind
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Lucene - Suche� WildCardQuery – Dokumente, die den Wildcards entsprechen,
werden ausgesucht. Wildcard besteht aus einem oder mehreren Zeichen (Platzhalter), die durch andere Zeichen realisiert sein können. Bei Lucene gibt es zwei Arten von Wildcards:
� Fragezeichen (?) – Platzhalter für ein beliebiges Zeichenz.B. te?t für text oder test
� Stern (*) – Plazthalter für beleibig viele Zeichenz.B. test* für test, tests oder tester
� FuzzyQuery – verbindet die Dokumente, die einen ähnlichen Term zu dem gesuchten beinhaltenz.B. Query: roam~ —> foam oder roams
� PrefixQuery� RangeQuery
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Lucene – Beispiel der Suche// Now search the index:IndexSearcher isearcher = new IndexSearcher(directory)
// Parse a simple query that searches for "text":QueryParser parser = new QueryParser("fieldname", analyzer);Query query = parser.parse("text");Hits hits = isearcher.search(query);assertEquals(1, hits.length());
// Iterate through the results:for (int i = 0; i < hits.length(); i++) {
Document hitDoc = hits.doc(i);assertEquals("This is the text to be indexed.", hitDoc.get("fieldname"));
}isearcher.close();directory.close();
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Lucene – Vorteile/Nachteile� Vorteile:
� Indexierung:� schnell� wenig Speicherplatz benötigt (1MB Heap)� Index ist kleiner um 70-80% als der Original-Text
� Suche:� ranked searching� Verschiedene Query-Typen vorhanden� Sortierung möglich� Effektive Modell-Kombination möglich (Vektor-Model + Boolean-Model)
� sehr flexibel (große Freiheit bei Gestaltung der Suche)� sehr gut dokumentiert� in vielen anderen Systeme verwendet� kostenlos
� Nachteile:� hoher Implementierungsaufwand
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Lucene-Beispiel: Klasse IndexWriter.java/**
* Adds a document to this index, using the provided analyzer instead of the* value of {@link #getAnalyzer()}. If the document contains more than* {@link #setMaxFieldLength(int)} terms for a given field, the remainder are* discarded.*/
public void addDocument(Document doc, Analyzer analyzer) throws IOException {DocumentWriter dw = new DocumentWriter(ramDirectory,
analyzer, this);dw.setInfoStream(infoStream);String segmentName = newSegmentName();dw.addDocument(segmentName, doc);synchronized (this) {
segmentInfos.addElement(new SegmentInfo(segmentName, 1, ramDirectory));
maybeMergeSegments();}
}
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Lupy-Beispiel: Klasse IndexWriter (in Python)
def addDocument(self, doc):
dw = documentwriter.DocumentWriter(self.ramDirectory, self.analyzer)
segmentName = self.newSegmentName()
dw.addDocument(segmentName, doc)
self.segmentInfos.append(segment.SegmentInfo(segmentName, 1, self.ramDirectory))
self.maybeMergeSegments()
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Lucene vs. Lupy� Lucene ist eine open-source Quellcode-Bibliothek für
Textsuchmaschinen� programmiert in Java� leistungsstark� umfangreiche Funktionen� Indexierung und Suche� zum Aufbau großer Suchmaschinen geeignet
� Lupy ist eine Portierung von Jakarta Lucene 1.2 (alte Version!) in Python.� Der Großteil von Lucene 1.2 wurde in Lupy verwendet.� Das Projekt wurde bis Mai 2004 von Amir Bakhtiar entwickelt� Projektseite: http://www.divmod.org/projects/lupy
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Lupy� Lupy - eine open-source Quellcode-Bibliothek für
Textsuchmaschinen
� programmiert in Python� mit Hilfe von Lupy kann man eine Volltextsuchmaschine
implementieren, die einen Text indexiert und den gebildeten Index durchsucht
� Text-Indexer kann zu der Indexierung der Textdokumente wie Web-Seiten, Quellcode, E-Mails benutzt werden
� Text-Suche - der Index wird nach den angegebenen Anfragen durchsucht
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Aufbau der Lupy-API
� Lupy-API:
� index - Paket
� search - Paket
� document.py (Document, Field)
� store.py (FSdirectory, RAMDirectory, Stream, FileStream, RAMStream)
� util.py (BitVector)
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Aufbau der Lupy-API (Index)� index
� documentwriter.py (DocumentWriter, Posting); Funktion: standardTokenizer
� field.py (FieldInfo, FieldInfos, FieldsWriter, FieldsReader)
� indexwriter.py (IndexWriter)
� segment.py (SegmentTermEnum, SegmentInfo, SegmentInfos)
� segmentmerger.py (IndexReader, SegmentTermDocs, SegmentTermPositions, SegmentMergeInfo, SegmentMerger, SegmentReader, Norm, SegmentsReader,
SegmentsTermDocs, SegmentsTermPosition, TermInfosReader)
� term.py (Term, TermInfo, TermInfosWriter)
� terminfo.py (TermInfo)
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Aufbau der Lupy-API (Suche)
� search
� boolean.py (BooleanQuery, BooleanClause, BooleanScorer, SubScorer)
� hits.py (Hits)
� indexsearcher.py (IndexSearcher, ScoreDoc, TopDocs)
� phrase.py (PhraseQuery, PhraseScorer, ExactPhraseScorer, PhrasePositions)
� similarity.py
� term.py (TermQuery, TermScorer)
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Unterschiede zu Lucene
� In Lupy (im Vergleich zu Lucene):
� gibt es keine Möglichkeit der Text- oder Anfragen-Analyse(in Lucene: Analyzer, TokenStream, Token, TokenFilter, Tokenizer, StopAnalyzer, StandardAnalyzer)
� gibt es keinen Query-Parser
� fehlen die Query-Datenstrukturen (FuzzyQuery, WildCardQuery, PrefixQuery, RangeQuery)
� wurden viele Klassen in Rahmen der Indexierung und Suchenicht implementiert
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Unser Experiment
� Implementierung einer Suchmaschine
� Ziel des Experiments
� Textkorpus
� Beispielanfrage
� Evaluierung
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Anwendung von Lupy
� Lupy Herunterladen
� Installation
� Implementierung einer einfachen „Suchmaschine“ und Kodierung der Queries
� Index erzeugen
� Index durchsuchen
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Implementierung (Liste der verwendeten Klassen)
� Indexerstellung� Import
� from lupy.index.indexwriter import IndexWriter
� from lupy import document
� Indexer (Klasse)� IndexWriter
� addDoc(fileName)� Document (aus document.py)
� Keyword (aus document.py)
� Text (aus document.py)
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Implementierung (Liste der verwendeten Klassen)
� Suche� Import
� from lupy.index.term import Term� from lupy.search.indexsearcher import IndexSearcher� from lupy.search.term import TermQuery� from lupy.search.phrase import PhraseQuery� from lupy.search.boolean import BooleanQuery
� termSearch(queryString)� Term� TermQuery
� phraseSearch(queryString, field)� PhraseQuery� Term
� boolSearch(ands=[], ors=[], nots=[])� BooleanQuery� Term� TermQuery
� IndexSearcher
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Ziel des Experiments� Der Test der Funktionalität des Programms
� Werden alle Äquivalente der Query im Index gefunden?� Wenn nicht: warum wurden einige Äquivalente nicht gefunden?� Werden alle relevanten Dokumente ausgegeben?
� Der Test der Anwendung:
� Mit Hilfe der Lupy-Bibliothek kann man eine Suchmaschine implementieren, der nur das Boolsche Modell zugrunde liegt.
� Wie gut eignet sich dieses Modell für die Informationsbeschaffung? Welche Informationen werden beschaffen?
� Wie kann die Programmeffizienz verbessert werden?� Wird eine Suchmaschine, die sich auf das Vektormodel stützt,
bessere Ergebnisse liefern?
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Textkorpus
� Textkorpus: 11 kurze Beschreibungen der Praktikumsstellen bei IBM, SAP und Siemens in deutsch und englisch
� Jeder Text besteht aus:
� einer Titelzeile (Name und Sitz des Unternehmens und Name der Praktikumsstelle)
� einem Inhalt mit den Zielen, Anforderungen und Aufgaben des Bewerbers
� Details: Dauer der Praktikum, Kennziffer der Anzeige
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Beispieltext� Text 0
IBM Böblingen - Automated analysis of customer related problem recordsBereich: IBM Entwicklung GmbH, ELEinsatzort: BöblingenDauer: Zwischen 3 und 5 MonateBeginn des Praktikums zwischen dem 01.11.2006 und dem 01.03.2007 möglich (Praktikum (Pflicht- / freiwillig) Vollzeit)Aufgabengebiet: The goal of this internship is to develop a program in perl to automatically analyse records about customer problems. Especially staticticaldata shall be extracted from text based records in varius formats (e.g. HTML).Anforderungen: English language[mandatory], Linux/UNIX[useful], Programming in Perl[useful]Unser Angebot: The Linux system Z development team at the Boeblingen lab is the system house and maintainer for Linux on the IBM System Z mainframe. We offer insight into a dynamic project from systems architecture to development and system verification even up to technical customer relationship management.
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Query� Queries:
Kenntnisse, Fähigkeiten oder Interesse des Bewerbers
� z.B. Der Bewerber kennt Java aber nicht Perl � man konstruiert eine Boolean-Anfrage: +Java und –Perl und � sucht den Index nach den Dokumenten durch, in denen Java aber nicht Perl
vorkommt
� Kodierung:� ([and - erforderlich], [or - optional], [and not - verboten])
� Beispiel: +c –perl - (['c'], [], ['perl'])
� Man darf keinen Ausdruck als erforderlich und gleichzeitig verboten spezifizieren
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Query� gesuchter Begriff: 'c++'� gesuchte Phrasen: “c++“, “human maschine dialog“
� gesuchte Ausdrücke:
� +'c' und -'perl‚
� +'c' (oder'java' oder'perl')
� +'develop' +'program' +'perl'
� +"information retrieval" (oder'text', oder'mining‚)
� +'information' +'retrieval' (oder'text', oder'mining‚)
� (oder'objektorientierten' oder'programmierung' oder'programmierungsprache‚)
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
SuchergebnisseQuery: +c-perlFound in document aesop\01.txt (IBM Böblingen - Softwarepraktikum im Bereich
Systemautomatisierung)Found in document aesop\08.txt (SAP Walldorf - Praktikant (w/m) für interaktive Web-
Programmierung)Found in document aesop\09.txt (SAP Walldorf - Praktikant / Werkstudent (w/m) mit
Schwerpunkt C++ Programmierung)
Query: +c java perlFound in document aesop\09.txt (SAP Walldorf - Praktikant / Werkstudent (w/m) mit
Schwerpunkt C++ Programmierung)Found in document aesop\01.txt (IBM Böblingen - Softwarepraktikum im Bereich
Systemautomatisierung)Found in document aesop\08.txt (SAP Walldorf - Praktikant (w/m) für interaktive Web-
Programmierung)Found in document aesop\03.txt (IBM Böblingen - Speech Recognition / Human Machine
Dialog / Large Vocabulary Transcription)Found in document aesop\02.txt (IBM Böblingen - Information Retrieval und Information
Mining Performance)
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
SuchergebnisseQuery: +develop+program+perlFound in document aesop\00.txt (IBM Böblingen - Automated analysis of customer
related problem records)
Query: +information retrievaltextminingNothing found!
Query: +information+retrieval text miningFound in document aesop\02.txt (IBM Böblingen - Information Retrieval und Information
Mining Performance)
Query: objektorientierten programmierung programmierungspracheFound in document aesop\10.txt (SAP Walldorf - Praktikant (w/m) für den Bereich Java
Server Technology )Found in document aesop\09.txt (SAP Walldorf - Praktikant / Werkstudent (w/m) mit
Schwerpunkt C++ Programmierung)Found in document aesop\08.txt (SAP Walldorf - Praktikant (w/m) für interaktive Web-
Programmierung)
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
SuchergebnisseQuery: software anwendungen softwareentwicklung
Found in document aesop\08.txt (SAP Walldorf - Praktikant (w/m) für interaktive Web-Programmierung)
Found in document aesop\02.txt (IBM Böblingen - Information Retrieval und Information MiningPerformance)
Found in document aesop\01.txt (IBM Böblingen - Softwarepraktikum im Bereich Systemautomatisierung)
Found in document aesop\09.txt (SAP Walldorf - Praktikant / Werkstudent (w/m) mit Schwerpunkt C++ Programmierung)
Query: c++
Nothing found!
Query: \c++\
Nothing found!
Query: \human machine dialog\
Found in document aesop\03.txt (IBM Böblingen - Speech Recognition / Human Machine Dialog / Large Vocabulary Transcription)
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Evaluierung
� Darstellung der Ergebnisse
� Sonderfälle
� Test der Funktionalität
� Test der Anwendung
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Ergebnisse
10001 (d. 3)1 (D. 3)“human maschine dialog“
605(D.1,2,3,8,9)05(D.1,2,3,8,9)
“c++“
605(D.1,2,3,8,9)05(D.1,2,3,8,9)
'c++'
7004 (D. 1,2,8,9)4 (D. 1,2,8,9)
+ software, +anwendung, +softwareentwicklung
8003 (D.8,9,10)3 (D.8,9,10)(oder'objektorientierten' oder'programmierung' oder'programmierungsprache‚)
10001 (D. 2)1 (D. 2)+'information' +'retrieval' (oder'text', oder'mining‚)
1001 (D. 2)01 (D. 2) +"information retrieval" (oder'text', oder'mining‚)
10001 (D. 0)1 (D. 0)+'develop' +'program' +'perl'
62 (D. 1,9)03 (D. 2,3,8)3 (D.2,3,8)+'c' (oder'java' oder'perl')
82 (D. 1,9)01 (D. 8)1 (D. 8)+'c' und -'perl
Irrelevant nicht ausgegeben
Irrelevant ausgegeben
Relevant nicht ausgegeben
Relevantausgegeben
Relevante Dokumente
Queries
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Ergebnisse
0100%100%“human maschine dialog“
4,1%72,72%59,39%Durchschnitt
000“c++“
000'c++'
0100%100%+ software, +anwendung, +softwareentwicklung
0100%100%(oder'objektorientierten' oder'programmierung' oder'programmierungsprache‚)
0100%100%+'information' +'retrieval' (oder'text', oder'mining‚)
000+"information retrieval" (oder'text', oder'mining‘)
0100%100%+'develop' +'program' +'perl'
25%100%20%+'c' (oder'java' oder'perl')
20%100%33,3%+'c' und -'perl
FalloutRecallPrecisionQuery
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Ergebnisse� Genauigkeit des Suchprozesses (Precision): der durchschnittliche
Wert der Präzision ist niedrig und liegt bei ca. 59%. Das bedeutet, dass unsere Suchmaschine ziemlich viele unpräzise Ergebnisse liefert. Außer den relevanten Dokumenten wurden auch die Dokumente ausgegeben, die der Anfrage nicht entsprechen.
� Vollständigkeit des Suchprozesses (Recall): unser Programm liefert entweder alle relevanten Dokumente (manchmal mit irrelevanten Dokumenten zusammen ), oder keine Dokumente, obwohl in denender gesuchte Begriff vorkommt. Der durchschnittliche Recall-Wert(ca. 73%) ist höher als der Precision-Wert, aber noch nicht optimal.
� Die Implementierung der Suchmaschine muss noch verbessert werden, so dass sie in Zukunft an 100% nahe liegende Ergebnisse liefert.
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Sonderfälle� +'c' und -'perl und +'c' (oder'java' oder'perl')
� In beiden Fällen ist Recall optimal (100%), aber Precision sehr niedrig (33,3% in dem ersten Fall und 20% in dem zweiten).
� Grund: es wurden alle Dokumente ausgegeben, in denen nicht nur ‘c‘ aber auch ‘c++‘ vorkommt. ‘+‘ ist ein Sonderzeichen (Boolscher Operator, siehe Ergänzung -Sonderzeichen), der bei der Indexierung ausgelassen wurde und in der Anfrage vorkommend bei der Suche ‘+‘ ignoriert wurde.
� +"information retrieval" (oder'text', oder'mining‘) vs. +'information' +'retrieval' (oder'text', oder'mining‘)
� Phrasenanfrage “information retrieval“ wurde nicht gefunden, wenn man aber nach zwei Termen “information“ und “retrieval“ fragt, wurde ein relevantes Dokument ausgegeben. Die Implementierung der Suchmaschine muss noch verbessert werden.
� 'c++' und “c++“� c++ sowohl als Term als auch als Phrasequery wurde nicht gefunden. ‘+‘ ist ein
Sonderzeichen (Boolscher Operator, siehe Ergänzung - Sonderzeichen), der nicht als Teil der Anfrage verwendet werden soll.
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Ergänzung - Sonderzeichen
� Sonderzeichen in Lucene+ - && || ! ( ) { } [ ] ^ " ~ * ? : \
� gehören zu den Schlüsselwörtern in Lucene
� um dieser Sonderbedeutung zu entgehen, verwendet man den Backslash “\“ vor dem Zeichen
� z.B. um den Ausdruck (1+1):2 zu suchen, wird die Query \(1\+1\)\:2 eingeführt
� In dieser Weise könnte man dieses Problem auch mit Lupy lösen
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Test der Funktionalität
� Nicht alle relevanten Dokumente wurden ausgegeben (Recall ca. 73%) und einige irrelevante Dokumente wurden geliefert (Precision ca. 59%)
� Nicht alle Äquivalente der Query wurden gefunden
� Die Implementierung unserer Suchmaschine muss ergänzt und verbessert werden.
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Test der Anwendung� Es wurde eine Menge der Dokumente ausgegeben, in denen der gesuchte
Ausdruck vorkommt (Totale Übereinstimmung des Dokuments mit dem Term). Ähnliche Dokumente, die nicht vollkommen mit der Anfrage übereinstimmen,werden im Boolschen Modell nicht berücksichtigt.
� Als Ergebnis wurden die Dokumente ausgegeben, in denen ein gesuchter Term oder Ausdruck einmal oder mehrmals vorkommt (Die präzise Anzahl derTermvorkommen ist für Boolsches Modell irrelevant)
� Wenn die Suchmaschine auf einem Vektormodell basiert, bekommt man die präziseren Ergebnisse und die ausgegebenen Dokumente werden nach dem Ähnlichkeitsgrad sortiert.
� Die Mängel unseres Programms liegen darin, dass die Lupy-Bibliothek nicht alle in Lucene-Version implementierten Funktionen zur Verfügung stellt (sie müssten von Anwender selbst implementiert werden).
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Verbesserungen
� Implementierung einer auf dem Vektormodell basierten Suchmaschine (Termfrequenz und nicht nur Termvorkommen wird berücksichtigt).
� Man könnte eine hybride Suchmaschine implementieren, die Boolsches Modell und Vektor-Modell verbindet.
� Integrieren einer Liste mit Stoppwörter – Index-Datei mit einer kleineren Anzahl der Elemente (Fields) wird durchsucht
� Berücksichtigen der Sonderzeichen
� …
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Exkurs: Softwaresysteme, die Lucene benutzen
� Wikipedia für Volltextsuche� Beagle benutzt ein Tor von Lucene zu C# Beagle ist eine Desktop-
Suchmachine, die die Suche nach Dateien, E-Mails, Chatlogs, etc. ermöglicht, ähnlich wie etwa Google Desktop Search
� Nutch (eine komplette Search Engineimplementierung), die Luceneverwendet
� CNET verwendet Lucene, um ihre Produktkategorieauflistungen zu suchen
� Midgard verwendet Lucene für seine Index-Bewegung und Ganztextsuche. Es ist ein Software-Framework, mit dem Webanwendungen wie Web Content Managment Systeme entwickelt werden können, um Informationen professionell online zu verwalten
� LIRE (Lucene Bild-Wiederherstellung), die die Lucene Search Engineverwendet
� Weitere Anwendungen siehe http://en.wikipedia.org/wiki/Lucene
Volltextsuche mit Lucene & Lupy Enikö Gross, Alina Tokarczyk
Literatur� Bazea-Yates, R., Ribeiro-Neto, B. (1999). Modern Information
Retrieval. New York.� Carstensen, K., et al. (Hrsg.) (2004). Computerlinguistik und
Sprachtechnologie. München.� Owens, Steven J (2001). Lucene Tutorial.
http://darksleep.com/lucene/� http://www.divmod.org/projects/lupy� Ferguson, John (2005). Lucene: a tutorial introduction to full-text
indexing in Java. http://www.jroller.com/page/wakaleo/?anchor=lucene_a_tutorial_introduction_to
� http://lucene.apache.org/java/docs/� Schumann, Georg (2006). Lucene. Volltextsuche mit Java.
cms.fh-augsburg.de/report/2006/Schumann_Georg__Lucene/Lucene.pdf