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.
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
@PurplePilot: muszę dokonać przetwarzanie ręcznie, więc można zaproponować API lub algorytmów związanych. – phoxis
można spróbować tego http://tipsandtricks.runicsoft.com/Other/JavaStemmer.html – PurplePilot