Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyszukiwanie frazy w ciągu znaków
Forum PHP.pl > Forum > PHP
markonix
Mamy dwa ciągi znaków.

Dłuższy np. "Piszę w sprawie Jan Kowalski" i listę możliwych użytkowników.

Chciałbym określić o jakiej osobie mowa jest w zdaniu, oczywiście najłatwiejsza opcja to sprawdzenie czy występuje w ciągu znaków imię i nazwisko oraz ewentualnie odwrotność. Ok, to mamy z z głowy, ale algorytm musi być bardziej zaawansowany i wykryć odmiany np. Jana Kowalskiego, Janka Kowalski itp. Nie zależy mi na 100% rozpoznaniu, wystarczy mi najbardziej zbliżony. Ktoś się kiedyś zmierzył?

Póki co mam 3 prototypy.

1) Full index.


  1. SELECT id, title, score FROM (SELECT id, title, MATCH (`title`) AGAINST('(Paweł* Żyra*) ("Paweł Żyra")' IN BOOLEAN MODE) AS score FROM titles) t WHERE `id` = 3 GROUP BY `score` HAVING `score` > 0 ORDER BY `score` DESC LIMIT 1

To najbardziej udane rozwiązanie, radzi sobie dość dobrze ale jest taki moment że po prostu się zacina i score wskakuje na zero np. przy frazie "Pawła Żyry" (ale radzi sobie jeszcze z np. "za Pawla Zyra"). Dużymm minusem jest optymalność, jak widać to wykonuje tyle zapytań ile mamy do przeszukania tytułów i nazwisk ponieważ nie da się wyszukiwać po wielu frazach. Po za tym wyszukiwanie te zachowuje się troszkę nieracjonalnie np. score jest uzależniony od innych wyników czyli zmienia się w czasie, a np. przy jednym wyniku pokazuje zero nawet gdy tekst jest 1:1.

2) Similar text

Czasem daje super wyniki, czasem beznadziejne. Z pewnością było by to dobre gdybym miał pewność że w title jest tylko imię i nazwisko.

3) levenshtein

Podobnie jak wyżej.

2 i 3 są znacznie szybsze i dają łatwiejszą manipulacje (np. mogę bez problemu wyciąć pl znaki i je ignorować, w mysql tego w locie nie potrafię zrobić albo byłoby to skomplikowane).
Pyton_000
Pytanie zasadnicze.

Skąd są dane. Zakładam że Input jest Tekst. Skąd będą imiona i nazwiska? Z oddzielnej tabeli?
markonix
Imiona i nazwiska z bazy / tablica. Tekst (title) powiedzmy, że z pliku csv, który jest wgrywany do bazy.

Generalnie poradziłem sobie z tematem, napisałem własny algorytm w oparciu o similar_text badający pary, zamiast całego tekstu + kilka innych czynników mniej istotnych, ale też wpływających na "score".
Tematu nie zamykam, może ktoś się mierzył z tematem i ma coś bardziej dedykowanego do wyszukiwania "wzmianek". Może ktoś pracuje przy algorytmach Google tongue.gif

To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.