grosstokarczyk volltextsuche mit lucene lupy -...

53
Ruprecht-Karls-Universität Heidelberg Seminar für Computerlinguistik HS: Information Retrieval PD Dr. Karin Haenelt WS 2006/07 Volltextsuche mit Lucene & Lupy Enikö Gross Alina Tokarczyk 22.01.2007

Upload: vuthien

Post on 16-Apr-2018

219 views

Category:

Documents


1 download

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