Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wyszukiwanie frazy w ciągu znaków, Imię i nazwisko w ciągu znaków
markonix
post 23.12.2018, 22:43:53
Post #1





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


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).

Ten post edytował markonix 23.12.2018, 22:45:19


--------------------
Go to the top of the page
+Quote Post
Pyton_000
post 27.12.2018, 16:14:02
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Pytanie zasadnicze.

Skąd są dane. Zakładam że Input jest Tekst. Skąd będą imiona i nazwiska? Z oddzielnej tabeli?
Go to the top of the page
+Quote Post
markonix
post 27.12.2018, 23:20:26
Post #3





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


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



--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.03.2024 - 11:19