2012-02-15 20 views
5

Potrzebuję segmentować słowa z tekstu. Czasami słowa dzielone są pisane bez myślników, a słowa apostrofu są pisane bez apostrofu. Istnieją również podobne problemy, takie jak różne kwestie pisowni tych samych słów (np. Kolor, kolor) lub pojedyncze słowo, które są zapisywane ze spacjami między nimi (np. Do, do góry, pusta przestrzeń, puste miejsce). Muszę zgrupować te warianty jako jedną reprezentację i wstawić ją do zestawu/hashmap lub innego miejsca. Mogą występować również problemy z akcentowanymi słowami znakowymi zapisanymi bez znaków akcentu (chociaż nie miałem do czynienia jeszcze z nimi). Obecnie i wycinanie słów przy dowolnym znaku pustej przestrzeni i każdym niealfanumerycznym, a następnie ich wycinanie i pomijanie słów kończących.Segmentowanie słów i grupowanie słów dzielonych i apostrofowych z tekstu

Te indeksy będą później używane do sprawdzania podobieństwa dokumentów i wyszukiwania itp. Wszelkie sugestie, jak mogę walczyć z tymi problemami? Pomyślałem o pomyśle dopasowania zeskanowanego słowa do listy słów, ale problem polega na tym, że właściwe rzeczowniki i słowa niesłyszące zostaną pominięte.

Info: Mój kod w Javie

+0

czy nie jest to, co robi jest wyszukiwarka? czy nie możesz zainstalować, powiedz Apache Solr, a następnie uruchom go na swoich plikach, aby wykonać zadanie tbnis? A może czegoś mi brakowało? – PurplePilot

+0

@PurplePilot: muszę dokonać przetwarzanie ręcznie, więc można zaproponować API lub algorytmów związanych. – phoxis

+0

można spróbować tego http://tipsandtricks.runicsoft.com/Other/JavaStemmer.html – PurplePilot

Odpowiedz

3

myślę, że należy zastosować kombinację technik.

1) W przypadku typowych wariantów pisowni stosowałbym metodę opartą na słowniku. Ponieważ są one powszechne, nie martwiłbym się brakiem niesłyszących słów. To powinno rozwiązać problem koloru/koloru.

2) W przypadku literówek i innych niestandardowych wariantów pisowni można zastosować algorytm Metaphone (http://pl.wikipedia.org/wiki/Metaphone), aby przekształcić tokeny w reprezentację ich angielskich wymowy. Podobne warianty brzmią podobnie, więc możesz je dopasować do siebie nawzajem (np. Jon do Jana). Możesz również użyć algorytmów dopasowywania opartych na odległościach do edycji, aby dopasować bardzo podobne tokeny tylko z parą zestawionych znaków lub upuszczoną literą (np. Huseyin kontra Housein).

3) W przypadku apostrofu i słów złożonych z łącznikiem między nimi można zapisać oba warianty. Na przykład "John's" będzie indeksowany zarówno jako "John s" i "Johns". "puste miejsce" może być konwertowane na (lub przechowywane wraz z) "puste miejsce" i "puste miejsce".

4) W przypadku słów złożonych bez żadnych łączników można użyć biblioteki zewnętrznej, takiej jak HyphenationCompoundWordTokenFilterFactory, klasa Solr (http://lucene.apache.org/solr/api/org/apache/solr/analysis/ HyphenationCompoundWordTokenFilterFactory.html). Mimo że może używać słownika, nie musi. Jest on przeznaczony do radzenia sobie ze złożonymi słowami, które często występują w języku niemieckim i podobnych językach. Nie widzę powodu, dla którego nie można zastosować go do języka angielskiego (musisz podać angielski słownik i pliki reguł dzielenia wyrazów).

W rzeczywistości ostatni punkt rodzi ważne pytanie. Nie sądzę, że zbudujesz własną bibliotekę wyszukiwania od zera. Jeśli to prawda, dlaczego nie używasz Lucene (lub Solr, która jest oparta na Lucene), bibliotece wyszukiwania opartej na Javie, która ma już metody i sposoby radzenia sobie z tymi problemami? Na przykład technika iniekcji umożliwia indeksowanie zarówno koloru, jak i koloru w tym samym miejscu w dokumencie; w związku z tym nie ma znaczenia, czy szukasz "kolorowych samochodów" czy "kolorowych samochodów" (zakładając, że dbasz o wynik). Istnieją filtry, które indeksują fonetycznie (http://lucene.apache.org/solr/api/org/apache/solr/analysis/PhoneticFilterFactory.html). Dostępny jest nawet komponent FuzzyQuery, który pozwala na dopasowanie do podobnych terminów określonej odległości edycyjnej (http://lucene.apache.org/core/old_version/docs/versions/3_2_0/api/all/org/apache/lucene/ search/FuzzyQuery.html)

Będziesz także musiał zdecydować, w którym momencie chcesz poradzić sobie z tymi problemami: Jednym z ekstremalnych podejść jest indeksowanie wszystkich możliwych wariantów tych haseł podczas indeksowania i używanie zapytań w obecnej postaci.To sprawi, że przetwarzanie zapytań będzie jasne, ale będzie kosztowało cię większy indeks (ze względu na wszystkie warianty, które musisz zapisać). Drugą skrajnością jest indeksowanie dokumentów takimi, jakimi są i rozszerzanie zapytań podczas wyszukiwania. Umożliwi to utrzymanie indeksu w niskiej cenie kosztem cięższego przetwarzania zapytań. Indeksowanie fonetyczne wymagałoby przetworzenia zarówno dokumentów podczas indeksowania, jak i zapytań podczas wyszukiwania. Dopasowanie rozmyte byłoby możliwe tylko w czasie wyszukiwania, ponieważ prawdopodobnie nie byłoby możliwe zapisanie wszystkich wariantów edycji wszystkich haseł w indeksie.