Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Procentowe podobieństwo stringów
Forum PHP.pl > Forum > PHP
scanner
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?
Bakus
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
scanner
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
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.
Bakus
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...
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-2025 Invision Power Services, Inc.