490 likes | 650 Views
Търсене в естествен език. Васил Момчев. Онтотекст. academy . devbg . org. www.devbg.org. Цел на лекцията. Разбиране на проблемите свързани с търсенето в текстови данни Запознаването с основни алгоритми за търсене в текст и тяхното оптимизиране
E N D
Търсене в естествен език Васил Момчев Онтотекст academy.devbg.org www.devbg.org
Цел на лекцията • Разбиране на проблемите свързани с търсенето в текстови данни • Запознаването с основни алгоритми за търсене в текст и тяхното оптимизиране • Примерни реализации на търсене в текст в основните бази данни и тяхното съпоставяне • Реализация на търсене на текст извън база данни
Основен алгоритъм за търсенето в текст • Въведение • Основен алгоритъм за търсенето на текстови даннии построяване на inverted index • Методи за оптимизирането скоростта на inverted index • Търсене на текст в базите данни – MySQL, Microsoft SQL Server и Oracle • Използване на други алгоритми за търсене в текст
Въведение Основни видове търсене
Въведение Основни изисквания към търсенето на текстова информация Търсене на думи, а не substring Пример: “London police release photos of terror suspects” “lease” не трябва да бъде откриван при търсенето в текст, за разлика от при substring търсене
Въведение Основни изисквания към търсенето на текстова информация Езиково и символно търсене Пример езиково търсене: Думата “mouse”, трябва да бъде откривана във всичките си езикови форми “mouse”, “mice”... Пример символно търсене: “C++”
Въведение Основни изисквания към търсенето на текстова информация Оценяване на резултатите Търсенето на думи, за разлика от търсенето на string не е точно дефинирано
Въведение Методи на оценяване на системите за търсене в текст • Резултатност (effectiveness) • точност на оценяване (precision) брой точни / брой върнати документи • точност на връщане (recall) брой точни / общ брой точни документи • Производителност (efficiency)
Основен алгоритъм за търсенето на текстови данни
Основен алгоритъм за търсенето на текстови данни Без значение от подхода е необходима структура от данни, която ефективно да извършва • Търсене на документ по термин (често) • Изтриване на документ (рядко) • Промяната съдържанието на документ (рядко) • Добавяне на нови документи (рядко)
Основен алгоритъм за търсенето на текстови данни Пример за inverted index: “Зелена гора”, “Червена къща”, “Зелена ябълка”, “Червена ябълка” гора (1); зелена (3);(1); къща (2); червена (4);(2); ябълка (4);(3); в скоби документите в които се среща ключовата дума
Основен алгоритъм за търсенето на текстови данни Видове inverted index, според типовете заявки: • Inverted file index – съдържа списък на всички термини и документите, в които се съдържат • Full inverted index – съдържа списък на всички термини, документите и позициите, в които се съдържат • Inverted index с честота на срещане на термините в документите– съдържа списък на всички термини и честотата им на срещане в документите
Основен алгоритъм за търсенето на текстови данни Приложение на различните inverted index: • Термин -> Документ (за булеви заявки) t1 (d1), (d2), … • Термин -> Документ; Честота на термин в документа (по-добра резултатност) t1 (d1, tf1), (d2, tf2), … • Термин -> Документ; Позиция (търсене на фрази и търсене по близост) t1(d1, p1), (d2, p2), …
Основен алгоритъм за търсенето на текстови данни For each document d in the collection Begin numSubSet = 1 While memory exists: For each term t in document d Find term t in the term dictionary If term t exists, add a node to its posting list Otherwise, add term t to the term dictionary Write SubSet of Inverted index to disk numSubSet = numSubSet + 1 Free memory End For I = 1 to numSubSet Merge SubSet I with Inverted Index
Основен алгоритъм за търсенето на текстови данни Различни реализации на inverted index, като структура от данни • Сортиран списък +бърз за създаване+бърз за търсене-много бавен за промяна на информацията
Основен алгоритъм за търсенето на текстови данни Различни реализации на inverted index, като структура от данни • B-дърво + бърз за търсене-създаването и промяната не може да бъде разпределена- сложна имплементация
Основен алгоритъм за търсенето на текстови данни Различни реализации на inverted index, като структура от данни • Поредица от малки сегментни индекси +бързи за създаване+бързи за промяна на информацията-по-бавни за търсене
Основен алгоритъм за търсенето на текстови данни Различни реализации на inverted index, като структура от данни • Hashtable + бърз за създаване, промяна и търсене- несортиран речник (трудности при търсене на wildcard и обединение на индекси)
Основен алгоритъм за търсенето на текстови данни Предимства на inverted index • Ефективно търсене на термин или поредица от термини срещу документ • Определя тежестта на термините според тяхната честота на срещане • Определя тежестта на документите според дължината на текст
Основен алгоритъм за търсенето на текстови данни Недостатъци на inverted index • Необходимост на значителни ресурси за генерирането • Големина на индексите, която може да надвишава и размера на самата индексирана информация
Основен алгоритъм за търсенето на текстови данни Общ процес на индексиране • Datastore • Filter • Sectioner • Lexer • Indexing engine
Основен алгоритъм за търсенето на текстови данни
Методи за оптимизиране скоростта на inverted index
Методи за оптимизиране скоростта на inverted index Няколко начина за оптимизиране скоростта на търсене: • Използване на различни preprocess стъпки за елиминиране на често срещани думи • Компресиране на данните • Компресиране на информацията за термините • Компресиране на информацията за срещането на термините • Елиминирани на части от заявката
Методи за оптимизиране скоростта на inverted index Използване на различни preprocess стъпки за елиминиране на често срещани думи – стоп думи Стоп думите могат да намалят размерът на inverted index около на 50%. Думата “the” се среща около 7% в текст на английски!
Методи за оптимизиране скоростта на inverted index Компресиране на информацията за термините consider; considerable; considerably; considerate; considerateness; consideration; considering;conservancy; conservation; conservationist; conservatism; conservative consider[4]able[4]ably[3]are[7]ateness[5]ation[3]ing converva[3]ncy[4]tion[7]tionist[4]tism[4]tive
Методи за оптимизиране скоростта на inverted index Компресиране на информацията за срещането на термините Документът Di е представен като Di – Di-1 ... 5600; 5679; 5684; 5685; 5780 … ... 79; 5; 1; 5; … • Числата се записват с по малко битове • Намалява големината на списъците с 10-15%
Методи за оптимизиране скоростта на inverted index Компресиране на данните води до: Предимства • Намаляване големината на индексите • Драстично намаляване броя на дисковите операции Недостатъци • Увеличава се значително времето за създаване на индекс
Методи за оптимизиране скоростта на inverted index Елиминирани на части от заявката Термин1, Термин2, ... Термин N Сортират се по-честота на срещане на термина (значимост) Термин 1 – 100% от документите Термин 2 – 80 % от документите Термин 3 – 60% от документите Възможност за определяне на стоп думи без статичното им задаване
Търсене на текст в базите данни Търсене на текст в базите данни – MySQL, Microsoft SQL Server и Oracle
Търсене на текст в базите данниMySQL 4.1 MySQL 4.1 MATCH (col1,col2,...) AGAINST (expr [IN BOOLEAN MODE | WITH QUERY EXPANSION]) където: • col1, col2 ... colN са колони от тип char, varchar или text на таблица от тип MyISAM • еxpr израз съдържащ: +задължителнаДума -неприсъстващаДума <думаСпонисъкРанк >думаСповисокРанк (група думи) ~отирцаниепрефикс* “фраза“
Търсене на текст в базите данниMySQL 4.1 Boolean search mode • Резултатите не са сортирани по score • Score може да приема стойности от 1 до броя на откритите думите (възможно е score да бъде изчисляван с различен израз от изразът за търсене) • Няма ограничение за честотата на срещане на думите
Търсене на текст в базите данни MySQL 4.1 MySQL не може да извършва: • Езиково търсене “test” != “tests” и символно търсене “C++” • Търсене на думи равни или по-малки от 3 символа по подразбиране • Да открива думи, които се срещат в повече от половината записи • Паралелно търсене в fulltext и обикновен индекс • Конфигурацията на собствени компоненти за разбор на думи (Lexer) и филтри (Filter)
Търсене на текст в базите данниMySQL 4.1 CREATE TABLE t_text (id INTEGER PRIMARY KEY, title TEXT, text TEXT); ALTER TABLE t_text ADD (FULLTEXT(title,text)); REPAIR TABLE t_text QUICK;
Търсене на текст в базите данни MySQL 4.1 SELECT id, MATCH (col1[,col2…]) AGAINST (‘exp1') AS score FROM articles WHERE MATCH (col1[,col2…]) AGAINST (‘exp1')
Търсене на текст в базите данниMicrosoft SQL Server 2000 Microsoft SQL Server 2000Fulltext Service • CONTAINS(column,’expr’) • CONTAINSTABLE(table, column, ‘expr’[, пърите N по ранк) • FREETEXT(column,’expr’) • FREETEXTTABLE(table, column, ‘expr’[, първите N по ранк) Където column може да приема стойност на колона или * (всички колони за таблицата)
Търсене на текст в базите данни Microsoft SQL Server 2000 Синтаксис на expr за търсене с CONTAINS или CONTAINSTABLE • Дума или фраза • Префикс на дума или фраза • Дума в близост до друга • Езиково търсене на различни форми на думата • Булеви заявки
Търсене на текст в базите данни Microsoft SQL Server 2000 Microsoft SQL Server 2000 не може да извършва: • Паралелно търсене по fulltext и обикновен индекс • Символно търсене “C++” • Лесно пренасяне на fulltext индекси между сървъри и техния backup • Конфигурацията на собствени компоненти за разбор на думи (Lexer) и филтри (Filter)
Търсене на текст в базите данни Microsoft SQL Server 2000 Управление на fulltext индексите посредством запазените процедури • sp_fulltext_catalog (управление на каталозите) • sp_fulltext_database (инициализира база за работа с fulltext каталози) • sp_fulltext_service (конфигурира процесът на индексиране) • sp_fulltext_table (добавя или прехва индекси върху таблица)
Търсене на текст в базите данни Microsoft SQL Server 2000 SELECT key, rank FROM CONTAINSTABLE(t_tree,text,’expr’, 100) SELECT id FROM t_tree WHERE CONTAINS(text, ‘expr’)
Търсене на текст в базите данни Oracle Oracle Database 10.1.0.2 SCORE(id) CONTAINS(column, ‘expr’[, id]) > 0 CATSEARCH(column, ‘expr’, ‘structured query’) > 0 MATCHES(column, text); където ‘expr’ е израз подържащ булеви изрази AND, OR, NOT, wildcard % и _, NEAR, ABOUT ‘structured query’ – най-често колона за сортиране ‘text’ – текст използван за класификация
Търсене на текст в базите данни Oracle Oracle Text подържа конфигурация на: • Datastore за извличане на данни директно, от няколко колони (запазена процедура), файл или URL • Filter (реализиран като запазена процедура) • Lexer (възможно е и собствена имплементация)
Търсене на текст в базите данни Oracle CREATE TABLE t_text (id NUMBER PRIMARY KEY, title VARCHAR2(4000), text CLOB) CREATE INDEX i_title ON t_text(title) INDEXTYPE IS CTXSYS.CONTEXT SELECT id, score(1) FROM t_textWHERE CONTAINS(text,‘expr',1) > 0
Използване на други алгоритми за търсене в текст
Използване на други алгоритми за търсене в текст Jarkarta Lucene • API за търсене на текст • Реализации с отворен код на Java и .NET • Позволява голяма гъвкавост в процеса на индексиране и търсене • Търсене на булеви изрази, близост на думи, фрази, диапазон стойности (числови и дати) • Конфигурация и имплементация на Lexer и Filter (Analyzer) • Лесен за вграждане в други приложения
Използване на други алгоритми за търсене в текст IndexWriter – клас използван при запазване индекс на диск Analyzer – клас обединяващ функциите на Lexer и Filter Document – клас представляващ документ за индексиране; съдържа name/value колекция от стригове представяща съдържанието Query – клас използван за търсене QueryParser – помощен клас за разбор на заявката и създване на обект от тип Query
Използване на други алгоритми за търсене в текст Индексиране на документ: IndexWriter index = new IndexWriter(myFile, myAnalyzer, true); // задава се Analyzer Document doc = new Document(); doc.add(Field.Text(“field1”,”value1”)); doc.add(Field.Text(“dbid”,”id”, false)); index.addDocument(doc); // индексиране на документа
Използване на други алгоритми за търсене в текст Откриване на документ: Searcher searcher = new IndexSearcher(myFile); Query myQuery = QueryParser.parse(“expr”, “field”, myAnalyzer); Hits hits = searcher.search(myQuery); hits.doc(0).get(“dbid”);
Търсене в естествен език Въпроси?