2009-10-22 12 views
16

Chciałbym, aby wyszukiwanie pełnotekstowego MySQL działało z tekstem w języku japońskim i chińskim, jak również w dowolnym innym języku. Problem polega na tym, że te języki i prawdopodobnie inne zwykle nie mają białej przestrzeni między słowami. Wyszukiwanie nie przydaje się, gdy musisz wpisać to samo zdanie, co w tekście.Podział słów w językach bez spacji między wyrazami (np. Azjatycki)?

Nie mogę po prostu umieścić spacji między każdą postacią, ponieważ angielski też musi działać. Chciałbym rozwiązać ten problem z PHP lub MySQL.

Czy mogę skonfigurować MySQL do rozpoznawania znaków, które powinny być ich własnymi jednostkami indeksującymi? Czy istnieje moduł PHP, który potrafi rozpoznać te znaki, więc mogłem po prostu wyrzucić je do indeksu?

Aktualizacja

Częściowym rozwiązaniem:

$string_with_spaces = 
    preg_replace("/[".json_decode('"\u4e00"')."-".json_decode('"\uface"')."]/", 
    " $0 ", $string_without_spaces); 

To sprawia, że ​​klasę postaci z co najmniej kilka znaków muszę traktować specjalnie. Powinienem chyba wspomnieć, że dopuszczalne jest znoszenie indeksowanego tekstu.

Czy ktoś zna wszystkie zakresy znaków, które muszę wstawić w przestrzeni?

Ponadto, musi istnieć lepszy, przenośny sposób reprezentowania tych znaków w PHP? Kod źródłowy w Literalnym Unicode nie jest idealny; Nie rozpoznaję wszystkich postaci; mogą nie być renderowane na wszystkich maszynach, z których muszę korzystać.

+3

Inne języki współczesne, które nie używać spacji między słowami są tajski, laotański, Khmer (Kambodży) i Birmy (Myanmar). W języku wietnamskim występuje powiązany problem, że spacje są używane między wszystkimi sylabami, z wyjątkiem słów obcych. – hippietrail

Odpowiedz

15

Słowo zerwania dla języków wymienionych wymagają podejście językowej, na przykład jeden, który korzysta ze słownikawraz ze zrozumieniem podstawowych zasad wynikających .

Słyszałem o stosunkowo udanych aplikacjach do wyszukiwania pełnotekstowego, które po prostu dzielą każdy znak jako odrębne słowo, po chińsku, stosując po prostu tokenizację kryteriów wyszukiwania dostarczonych przez użytkowników końcowych. Wyszukiwarka zapewnia lepszą pozycję w rankingu dla dokumentów, które dostarczają znaki - słowa w takiej samej kolejności, jak kryteria wyszukiwania. Nie jestem pewien, czy można to rozszerzyć na język taki jak japoński, ponieważ zestawy znaków Hirakana i Katagana sprawiają, że tekst jest bardziej zbliżony do języków europejskich z krótkim alfabetem.

EDIT:
Resources
To słowo łamanie problem, jak również związanych z tym kwestii, jest tak nietrywialne że całe książki zostały napisane na ten temat. Zobacz na przykład CJKV Information Processing (CJKV oznacza chiński, japoński, koreański i wietnamski, możesz również użyć słowa kluczowego CJK, ponieważ w wielu tekstach nie jest omawiana wietnamska). Zobacz także Word Breaking in Japanese is hard dla jednego pagera na ten temat.
Zrozumiałe, że większość materiałów dotyczących tego tematu jest napisana w jednym z podstawowych języków ojczystych, a zatem jest ograniczona w użyciu dla osób bez względnej biegłości w tych językach. Z tego powodu, a także aby pomóc ci zweryfikować wyszukiwarkę po rozpoczęciu wdrażania logiki łamania wyrazów, powinieneś zwrócić się o pomoc do native speakera lub dwóch.

Różne pomysły
Twój pomysł identyfikujących znaków, które systematycznie oznaczać słowo złamać (słownie notowania, nawiasów, myślnik, jak postacie i takie) jest dobre, a to jest chyba jedna heurystyczne stosowane przez niektóre z profesjonalnej klasy łamacze wyrazów. Powinieneś jednak szukać autorytatywnego źródła takiej listy, zamiast gromadzić je od zera, na podstawie anegdotycznych ustaleń.
Podobnym pomysłem jest złamać słowa w Kana-to-Kanji przejścia (ale zgaduję nie na odwrót), a być może w hiragana-to-Katakana lub odwrotnie przejściami.
Niezwiązane z łamaniem wyrazów, indeks może [-lub nie może- ;-)] korzystać z systematycznego przekształcania każdej, powiedzmy, postaci hiragany w odpowiadającą jej postać katakana. Tylko niewykształcony pomysł! Nie wiem wystarczająco dużo o języku japońskim, żeby wiedzieć, czy to pomogłoby; intuicyjnie, byłaby ona luźno podobna do systematycznego przekształcania podkreślonych liter i podobnych w korespondujący list nieakcentowany, jak to praktykowane w kilku językach europejskich.

Być może pomysł, o którym wspomniałem wcześniej, polegający na systematycznym indeksowaniu poszczególnych znaków (oraz na uszeregowaniu wyników wyszukiwania na podstawie ich kolejności w kolejności do kryteriów wyszukiwania) może być nieco zmieniony, na przykład poprzez zachowanie kolejnych znaków kana, a następnie inne zasady ... i stworzyć niedoskonałą, ale wystarczająco praktyczną wyszukiwarkę.

Nie rozczaruj się, jeśli tak nie jest ... Jak stwierdzono, nie jest to banalne i może zaoszczędzić czas i pieniądze, w dłuższej perspektywie, poprzez przerwę i czytanie książki lub dwóch. Innym powodem, aby spróbować dowiedzieć się więcej o „teorii” i najlepszych praktyk, jest to, że w tej chwili wydaje się być skupiona na słowo łamanie ale wkrótce, wyszukiwarka może również korzystać z wynikającego świadomość ; w istocie te dwie kwestie są, co najmniej lingwistyczne, powiązane i mogą odnieść korzyści z bycia traktowanymi w tandemie.

Życzymy powodzenia w tym irytującym, ale godnym wysiłku.

+0

Całkowicie dopuszczalne jest dzielenie złożonych słów. Po prostu muszę wiedzieć, kiedy podzielić symbole. Zobacz, jak niedługo otrzymam aktualizację częściowego rozwiązania. –

+0

Wybacz mi. Chciałem też podziękować za poświęcony czas. :) –

+0

@Joe: Nie ma za co. Zdarza mi się, że interesuję się językoznawstwem i NLP, ale bardzo, bardzo małą wiedzą specyficzną dla języków CJK. Czytam moją edycję, dodając kilka słów kluczowych i odnośników online, które mogą pomóc w Twoim zadaniu.Powodzenia :-) – mjv

1

rok później, a ty chyba nie trzeba tego dłużej ale kod na następnej stronie może mieć kilka wskazówek na to, co chcesz (ED) zrobić:

http://www.geocities.co.jp/SiliconValley-PaloAlto/7043/spamfilter/japanese-tokenizer.el.txt

Jeśli zrobiłem postępy po powyższych postach we własnym wyszukiwaniu Jestem pewien, że inni byliby zainteresowani.

(Zmieniano powiedzieć istnieje lepsza odpowiedź tutaj: How to classify Japanese characters as either kanji or kana?)

+1

Okazało się, że rozpoznanie zakresu znaków w przykładzie z aktualizacji mojego pytania rozwiązało problem we wszystkich dotychczasowych przypadkach. Przynajmniej nasza mała liczba użytkowników, z którymi ma to duże znaczenie, jest zadowolona. –

+0

Z niecierpliwością czekam na dzień, w którym to rozwiązanie nie jest już odpowiednie i mogę rozwiązać problem w sposób bardziej kompletny i interesujący. –

+0

Dziękuję za poświęcony czas. –