![]() |
![]() |
![]()
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. |
|
|
![]() |
![]()
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.
|
|
|
![]()
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) |
|
|
![]()
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%) ![]() ![]() |
|
|
|
![]()
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? |
|
|
![]()
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
|
|
|
![]()
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)
|
|
|
![]()
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)
|
|
|
![]()
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% |
|
|
![]()
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) |
|
|
![]()
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 ¬¬
|
|
|
![]()
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 |
|
|
![]()
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? |
|
|
![]()
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 |
|
|
![]()
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)
|
|
|
![]()
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)
|
|
|
![]()
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)
|
|
|
![]()
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 |
|
|
![]()
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
|
|
|
![]()
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) |
|
|
![]()
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)
|
|
|
![]()
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) |
|
|
![]()
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ć:
(IMG:style_emoticons/default/wink.gif) Ten post edytował mls 17.02.2015, 14:58:32 |
|
|
![]()
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)
|
|
|
![]()
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)
|
|
|
![]()
Post
#26
|
|
Grupa: Zarejestrowani Postów: 677 Pomógł: 89 Dołączył: 31.08.2003 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
@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 |
|
|
![]()
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:
zwraca: bbb?(IMG:style_emoticons/default/questionmark.gif) (IMG:style_emoticons/default/questionmark.gif) ?ccccc edit: dopiero dodanie setlocale poprawia sprawe
|
|
|
![]()
Post
#28
|
|
Grupa: Zarejestrowani Postów: 677 Pomógł: 89 Dołączył: 31.08.2003 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
@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... |
|
|
![]()
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) |
|
|
![]() ![]() |
![]() |
Aktualny czas: 18.09.2025 - 13:51 |