Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Algorytm podobienstwa
nospor
post
Post #1





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Znacie jakieś w miare dobra algorytmy na znajdywanie podobienstwa dwóch nazwa składających się z wielu wyrazów?

Podobienstwo na zasadzie:
kapitaliki,
jedno slowo podobne
edna litera inna,
znaki interpunkcyjne inne

Najlepiej jakby dało się do zrobić na poziomie zapytania do bazy. Jak nie to obróbka w php.

Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 28)
r4xz
post
Post #2





Grupa: Zarejestrowani
Postów: 673
Pomógł: 106
Dołączył: 31.12.2008

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


Może algorytm Levenshtein distance, nawet znajdzie się coś do tego w sql (nie sprawdzałem jak działa). Nigdy też tego nie implementowałem, a więc moja wiedza jest czysto teoretyczna (więc pewnie i znikoma) na temat tego algorytmu, ale spróbować zawsze warto.
Go to the top of the page
+Quote Post
nospor
post
Post #3





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




No właśnie ta nazwa mi coś chodziła po głowie (IMG:style_emoticons/default/smile.gif)
Dzięki za linki, jak już coś mi się uda zrobić dam znać.

Jak zwykle jeśli ktoś ma coś do dodania to zapraszam (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
redeemer
post
Post #4





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

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


http://php.net/manual/en/function.levenshtein.php

@nospor: piszesz ceneo2? :-)
Go to the top of the page
+Quote Post
nospor
post
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Nie, nie piszę ceneo2 (IMG:style_emoticons/default/smile.gif) Widzę łączysz wątki (IMG:style_emoticons/default/wink.gif)

No dobra, ale sam levenshtein nie da rezultatow, jakie oczekuje.

Zalozmy ze porownuje slowa:
echo $lev = levenshtein('Blabla', 'Blabla sp zoo');
echo $lev = levenshtein('Blabla', 'Bleble');

To wg lev, blizsze mi bedzie Bleble, podczas gdy wg mnie bliższe ma byc Blabla sp zoo. Trzeba będzie albo wzbogacić algorytm o levenshteina i cos jeszcze lub moze jest coś jeszcze innego?
Go to the top of the page
+Quote Post
redeemer
post
Post #6





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

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


Może jakoś zmixować to z https://en.wikipedia.org/wiki/Hunt%E2%80%93McIlroy_algorithm
Go to the top of the page
+Quote Post
pyro
post
Post #7





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


Proponuję najpierw sprecyzować jakiego podobieństwa albo przynajmniej przybliżonego algorytmu jakiego oczekujesz oraz przykłady I/O jakich byś oczekiwał rezultatów, bo "chcę jakieś określanie podobieństwa, dostałem levenshtein, ale nie o takie podobieństwo mi chodziło" naprawdę nie mówi absolutnie nic (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
nospor
post
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@pyro tak masz racje. Sam czekam jeszcze na konkretne przykłady. Chciałem jednak w miedzyczasie zasięgnąć już jakieś teorii (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
sazian
post
Post #9





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

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


$p=0;
similar_text("Blabla","Blabla sp zoo",$p);
var_dump($p);
daje 63%

similar_text("Blabla","Blable",$p);
var_dump($p);
daje 83%
Go to the top of the page
+Quote Post
nospor
post
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@sazian, tak, juz testowalem tez similar text. Jak dostane konkretne dane to bede testowal najlepsze rozwiązanie (IMG:style_emoticons/default/smile.gif)

edit: dobra, dzieki panowie. Mix levensteina z rozbijaniem na słowa działa niemalże idealnie. Na jakies 95% (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
aniolekx
post
Post #11





Grupa: Zarejestrowani
Postów: 340
Pomógł: 46
Dołączył: 31.07.2009
Skąd: A

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


to może pochwal się dokładnym rozwiązaniem ¬¬
Go to the top of the page
+Quote Post
nospor
post
Post #12





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Ok, postaram sie po weekendzie przygotowac paczke (IMG:style_emoticons/default/smile.gif)



edit:
https://github.com/nospor/similarity
Go to the top of the page
+Quote Post
kilab
post
Post #13





Grupa: Zarejestrowani
Postów: 180
Pomógł: 19
Dołączył: 4.11.2007

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


Dzięki @nospor za paczkę, robi dobrą robotę (IMG:style_emoticons/default/smile.gif)

Ja akurat właśnie muszę zrobić odnajdywanie podobnych słów, ale na poziomie bazy i korzystając z okazji, że temat w offtopie, mam do was pytanie. Najwyżej zgarnę srogie baty (IMG:style_emoticons/default/biggrin.gif)

Otóż tak. Mam dwie identyczne bazy w MySQL i PostgreSQL na których badam wydajność żeby ostatecznie po tygodniach testów pozostać na MySQL lub przejść na PostgreSQL.
Do MySQL dodałem funkcję wykorzystującą algorytm levenshteina znalezioną tu: http://stackoverflow.com/questions/1390988...nction-in-mysql która działa, ale przy tabeli 40 tys. rekordów wykonanie najprostszego zapytania wykorzystującego tę funkcję trwa ok 15 s. Docelowo ma on działać na trochę większej tabeli, ok. 250 tys. rekordów więc rozwiązanie raczej marne. Na ogromny plus wychodzi w tej sytuacji PostgreSQL, w którym wykonanie zapytania wykorzystującego funkcję levenshteina z modułu fuzzystrmatch trwa zaledwie 0,5 s. na takiej samej liczbie rekordów (40 tys.).

No i to pytanie docelowe - czy to wydaje się być realne i normalne, że różnica czasu w wykonaniu bardzo podobnych do siebie zapytań na dwóch tych bazach jest taka duża?
Go to the top of the page
+Quote Post
nospor
post
Post #14





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Skoro w PostgreSQL korzystasz z gotowej wbudowanej biblioteki to tak, jest duża szansa że bedzie działać ona szybciej niż jakiś kod napisany przez kogos w necie.

Też chciałem robić to na poziomie bazy. Jednak szybko się okazało, że sam levenshtein jest niewystarczający, wiec musiałem się przerzucić na php.
Moge dodać, że sprawdzenie ponad 200tys tekstow trwa około 5 sekund
Go to the top of the page
+Quote Post
com
post
Post #15





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


skoro w hydeparku to pozwolę sobie na mały offtop ta bółka przez ó to mnie razi (IMG:style_emoticons/default/tongue.gif) a tak generalnie możesz dorzucić na stopkę, może się komuś przydać (IMG:style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
nospor
post
Post #16





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Z tą bółką to na tym polegał dowcip (IMG:style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
com
post
Post #17





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


hahaha ok (IMG:style_emoticons/default/biggrin.gif) znaczy się wiedziałem, że to dla jaj napisane ale rzuciło mi się strasznie w oczy (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
Crozin
post
Post #18





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Skoro będziesz tego potrzebował do jakiegoś wyszukiwania to dlaczego nie skorzystasz z narzędzi do wyszukiwania, np. SOLR/ElasticSearch (oba działają na Lucene)? Przygotowując odpowiednie indeksy, które będą działały na znormalizowanych wyrazach otrzymasz dużo lepsze wyniki.

Ten post edytował Crozin 17.02.2015, 13:33:32
Go to the top of the page
+Quote Post
Pyton_000
post
Post #19





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

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


Ale Ty @com jesteś łatwowierny ;P @nospor zrobił byka i żeby się obronić napisał że niby celowe (IMG:style_emoticons/default/wink.gif) A że Mod to trzeba się zgadzać ;P I Banik ;D
Go to the top of the page
+Quote Post
nospor
post
Post #20





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@Crozin tam gdzie to wrzucam, nie miałem dostępu do Lucene
@Pyton prorok jak czy co.... (IMG:style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
com
post
Post #21





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


no dlatego przyznałem mu rację proroku (IMG:style_emoticons/default/tongue.gif) no a tak bardziej pasowało do tego co tam stworzył, wiec niech bd błąd wybaczony (IMG:style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
nospor
post
Post #22





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Oj bo pisałem szybko
spółka bółka
i tak fajnie do rymu wyszło (IMG:style_emoticons/default/biggrin.gif)

Dobra, "żart" usunięty, jest już poprawnie (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
mls
post
Post #23





Grupa: Zarejestrowani
Postów: 677
Pomógł: 89
Dołączył: 31.08.2003
Skąd: Warszawa

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


No ale funkcja clean mogłaby być napisana zdecydowanie prościej (IMG:style_emoticons/default/wink.gif) Pomijając już zamianę polskich literek (bo co, jeśli tam będą umlauty lub inne akcenty?) to te cztery preg_replace można było zastąpić maksymalnie dwoma...

Ogólnie, możnaby uprościć:
  1. public function clean($text) {
  2. $text = iconv('utf8', 'ascii//translit//ignore', trim($text));
  3. $text = preg_replace('#[^a-z0-9]+#', ' ', strtolower($text));
  4. $text = preg_replace('#[\s]+#', ' ', $text);
  5. return trim($text);
  6. }

(IMG:style_emoticons/default/wink.gif)

Ten post edytował mls 17.02.2015, 14:58:32
Go to the top of the page
+Quote Post
Pyton_000
post
Post #24





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

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


GitHub jest Twój (IMG:style_emoticons/default/wink.gif) Fork, pull request i jedziesz (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
nospor
post
Post #25





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@mls masz racje. Jesli moglbys zrobic to co mowi Pyton, to chetnie bym zobaczyl jak sie na githubie zarządza forkami (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
mls
post
Post #26





Grupa: Zarejestrowani
Postów: 677
Pomógł: 89
Dołączył: 31.08.2003
Skąd: Warszawa

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


Cytat(nospor @ 17.02.2015, 15:06:22 ) *
@mls masz racje. Jesli moglbys zrobic to co mowi Pyton, to chetnie bym zobaczyl jak sie na githubie zarządza forkami (IMG:style_emoticons/default/smile.gif)


Proszzz:
https://github.com/mlask/similarity
+ pull request na oryginalnym repo (IMG:style_emoticons/default/wink.gif)

Ten post edytował mls 18.02.2015, 00:02:18
Go to the top of the page
+Quote Post
nospor
post
Post #27





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@mls a testowales to? Bo mi niestety Twoj kod:
  1. $text = 'bbbąęśĄĘŚccccc';
  2. echo iconv('utf8', 'ascii//translit//ignore', trim($text));
zwraca:
bbb?(IMG:style_emoticons/default/questionmark.gif) (IMG:style_emoticons/default/questionmark.gif) ?ccccc

edit: dopiero dodanie setlocale poprawia sprawe
  1. $text = 'bbbąęśĄĘŚcccccWeiß, Goldmann, Göbel, Weiss, Göthe, Goethe und Götz';
  2. setlocale(LC_CTYPE, 'pl_PL.utf-8');
  3. echo iconv('utf-8', 'ascii//translit', $text);
Go to the top of the page
+Quote Post
mls
post
Post #28





Grupa: Zarejestrowani
Postów: 677
Pomógł: 89
Dołączył: 31.08.2003
Skąd: Warszawa

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


Cytat(nospor @ 18.02.2015, 12:32:27 ) *
@mls a testowales to? Bo mi niestety Twoj kod:


Testowałem. Problemem jest w większości przypadków nie do końca prawidłowa biblioteka z której korzysta iconv. Na systemach linuksowych, np. na Ubuntu, używana jest biblioteka "glibc" zamiast poprawnej "libiconv". U mnie działa, bo "mam maka", bo tu standardowo jest libiconv. Ale faktycznie, zapomniałem, że z iconv mogą być problemy. A multibyte_string nie obsługuje transliteracji...
Go to the top of the page
+Quote Post
nospor
post
Post #29





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




No właśnie...
No nic, dzieki za pull (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 18.09.2025 - 13:51