Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Procentowe podobieństwo stringów
scanner
post
Post #1





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




Potrzebuję dla pewnego projektu napisac wyszukiwarke tekstową z procentowym sortowaniem trafności.
Jako że jest późna pora, przed snem walnąłem poniższy kodzik:[php:1:d6d9cf3ab1]<?php
$strSentence = 'Gdyby wybory parlamentarne odbyły się w kwietniu, 33-procentowe poparcie uzyskałaby Platforma Obywatelska. Na drugiej pozycji znalazłaby się Samoobrona z 24-procentowym poparciem, a na dalszych miejscach: Socjaldemokracja Polska - 10%, i PiS - 7%.';
$strSearchPhrase = 'Samoobrona Platforma poparcie';
$fltTotalSimilarity = 0.0;

$arrNeedle = explode( ' ', $strSearchPhrase );
$arrHaystack = explode( ' ', $strSentence );

foreach ($arrNeedle as $strNeedle )
{
foreach ($arrHaystack as $strHaystack )
{
similar_text( $strHaystack, $strNeedle, &$fltSimilarity );
$fltTotalSimilarity += $fltSimilarity;
}
}
echo $fltTotalSimilarity.'%<br />';
?>[/php:1:d6d9cf3ab1]Dla podanego tekstu, wynik wynosi 1958.68821553% co jest oczywisice wartością śmieszną.
Wydaje mi się, ze ten wynik powinienem zredukować jakoś przeliczając $fltTotalSimilarity przez ilość słów w obydwu podanych ciągach na przykład.. lub w jakiś inny sposób zredukowąć do zakresu 0% - 100%, ale nic mi nie przychodzi do głowy.
Może Wam coś zaświta?
_________________________________________
Dodam jeszcze, że zastosowanie prostego:[php:1:d6d9cf3ab1]<?php
$strSentence = 'Gdyby wybory parlamentarne odbyły się w kwietniu, 33-procentowe poparcie uzyskałaby Platforma Obywatelska. Na drugiej pozycji znalazłaby się Samoobrona z 24-procentowym poparciem, a na dalszych miejscach: Socjaldemokracja Polska - 10%, i PiS - 7%.';
$strSearchPhrase = 'Samoobrona Platforma poparcie';
$fltTotalSimilarity = 0.0;

similar_text( $strSentence, $strSearchPhrase, &$fltTotalSimilarity );
echo $fltTotalSimilarity.'%<br />';
?>[/php:1:d6d9cf3ab1]Daje wynik 19.5652173913% - może pozostać przy tym prostym rozwiązaniu?


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post
Bakus
post
Post #2


Administrator serwera


Grupa: Przyjaciele php.pl
Postów: 909
Pomógł: 0
Dołączył: 12.08.2003
Skąd: /var/www/wroclaw.php

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


Ja bym pozostał przy tym prostym rozwiązaniu... W końcu poco kombinować mając działający gotowiec... winksmiley.jpg

Bardzo często stosuję przy mojej pracy stwierdzenie "najprostrze rozwiązania są najbardziej dopracowane" winksmiley.jpg i wszystko działa

Heh... ja przy budowaniu wyszukiwarki użyłem znacznie prostrzego mechanizmu porównywania - ilość wystąpień poszukiwanej frazy w tekście. Mając największą ilość wystąpień zapisaną w zmiennej, wyliczałem wartości procentowe dla kolejnych trafień...
Mimo wyjątkowej prostoty efekt jest winksmiley.jpg


--------------------
Powrót do przeszłości :)
Go to the top of the page
+Quote Post
scanner
post
Post #3





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




Wciąż się zastanawiam, jak ustalić współczynnik zgodności.
Zaletą pierwszego rozwiązania jest to, że jeśłi mi wyskoczy wynik powyżej 100%, to go obcinam do właśnie 100% i urzytkownik widzi, że w poszukiwanym ciagu jego fraza jest.

Na chwile obecna mam trzy metody:[php:1:36caa674bc]<?php
$strSentence = 'Gdyby wybory parlamentarne odbyły się w kwietniu, 33-procentowe poparcie uzyskałaby Platforma Obywatelska. Na drugiej pozycji znalazłaby się Samoobrona z 24-procentowym poparciem, a na dalszych miejscach: Socjaldemokracja Polska - 10%, i PiS - 7%.';
$strSearchPhrase = 'Samoobrona Platforma poparcie';
$fltTotalSimilarity = 0.0;
$fltSimilarity = 0.0;

$arrNeedle = explode( ' ', $strSearchPhrase );
$arrHaystack = explode( ' ', $strSentence );


// --------------------------------------------------
// Porównujemy poszczegolne wyrazy obu ciągów
// --------------------------------------------------

foreach ($arrNeedle as $strNeedle )
{
foreach ($arrHaystack as $strHaystack )
{
similar_text( $strHaystack, $strNeedle, $fltSimilarity );
$fltTotalSimilarity += $fltSimilarity;
}
}
echo $fltTotalSimilarity.'%<hr />';
$fltTotalSimilarity = 0.0;

// --------------------------------------------------
// Porównujemy bezpośrednio ciągi
// --------------------------------------------------
similar_text( $strSentence, $strSearchPhrase, $fltTotalSimilarity );
echo $fltTotalSimilarity.'%<hr />';
$fltTotalSimilarity = 0.0;

// --------------------------------------------------
// Porównujemy każdy wyraz frazy szukanej z całym
// ciagiem przeszukiwanym
// --------------------------------------------------
foreach ($arrNeedle as $strNeedle )
{
similar_text( $strSentence, $strNeedle, $fltSimilarity );
$fltTotalSimilarity += $fltSimilarity;
}
echo $fltTotalSimilarity.'%<hr />';
?>[/php:1:36caa674bc]I nie wiem, która pokazuje najtrafniejsze wyniki, które wyglądają kolejno:
Cytat
1958.68821553%
19.5652173913%
21.0878609712%


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post
scanner
post
Post #4





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




JUż Ci na ircu powiedziąłem: nie przeczytales dokładnie mojego problemu.
Mam Trzy metody, w których wykorzystuje własnie [manual:f34d14010c]similar_text[/manual:f34d14010c] i szukam opiini, która jest najbardziej wiarygodna.


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post
Bakus
post
Post #5


Administrator serwera


Grupa: Przyjaciele php.pl
Postów: 909
Pomógł: 0
Dołączył: 12.08.2003
Skąd: /var/www/wroclaw.php

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


Czytając przeszukiwany tekst i frazę do wyszukania dał bym około ~40% trafności... w takim układzie najbliższa oczekiwań jest wersja 3...


--------------------
Powrót do przeszłości :)
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 Aktualny czas: 19.08.2025 - 07:29