similar_text (of levenshtein) en str_ireplace
Hallo,
Wat ik wil combineren is een replace met een aantal procent dat de gezochte tekst overeen moet komen.
Is dat mogelijk met PHP?
Voorbeeld
$text = 'Dit is een test tekst, waar zomaar wat in staat!';
$textnew = str_ireplace('test' '', $text);
resultaat zal zijn:
Dit is een tekst, waar zomaar wat in staat!
Maar het moet dan ook werken als het woord niet geheel overkomt.
$text = 'Dit is een tets tekst, waar zomaar wat in staat!';
$textnew = str_ireplace('test' '', $text);
Je kan met similar_text de gelijkheid meten in %, maar krijg dat niet gecombineerd met str_replace
Groet,
Dennis
Wat ik wil combineren is een replace met een aantal procent dat de gezochte tekst overeen moet komen.
Is dat mogelijk met PHP?
Voorbeeld
$text = 'Dit is een test tekst, waar zomaar wat in staat!';
$textnew = str_ireplace('test' '', $text);
resultaat zal zijn:
Dit is een tekst, waar zomaar wat in staat!
Maar het moet dan ook werken als het woord niet geheel overkomt.
$text = 'Dit is een tets tekst, waar zomaar wat in staat!';
$textnew = str_ireplace('test' '', $text);
Je kan met similar_text de gelijkheid meten in %, maar krijg dat niet gecombineerd met str_replace
Groet,
Dennis
Ik denk dat je beter woord voor woord een percentage kunt ontwikkelen en deze te vergelijken met een quotum (75% o.i.d.). Groter als 75% -> vervangen. Nadeel is echter dat woorden als 'is' en 'ik' 50% verschillen, terwijl 'test' en 'tast' maar voor 75% scheelt. Een quotum aan de hand van het aantal letters is dus beter te doen.
Waar wil je dit voor gebruiken?
Waar wil je dit voor gebruiken?
Voorbeeldje van wat je ongeveer zou kunnen doen:
Helaas is de levenshteinafstand tussen test en tekst kleiner dan die tussen test en tets. Dus wat dat betreft werkt het niet echt handig. Misschien dat similar_text of soundex beter werken, zoals je zelf al aangaf.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$tekst = 'Dit is een tekst, met een tets woord test erin!';
function fuzzy_replace($search, $replacement, $text, $threshold)
{
$words = explode(" ", $text); // zou iets intelligenters moeten zijn met bijv preg_split, dat ook leestekens loshaalt
foreach ($words as &$word)
if (levenshtein($word, $search) / strlen($word) < $threshold)
$word = $replacement;
return implode(' ', $words);
}
echo fuzzy_replace('test', 'xxxx', $tekst, 0.4);
?>
$tekst = 'Dit is een tekst, met een tets woord test erin!';
function fuzzy_replace($search, $replacement, $text, $threshold)
{
$words = explode(" ", $text); // zou iets intelligenters moeten zijn met bijv preg_split, dat ook leestekens loshaalt
foreach ($words as &$word)
if (levenshtein($word, $search) / strlen($word) < $threshold)
$word = $replacement;
return implode(' ', $words);
}
echo fuzzy_replace('test', 'xxxx', $tekst, 0.4);
?>
Helaas is de levenshteinafstand tussen test en tekst kleiner dan die tussen test en tets. Dus wat dat betreft werkt het niet echt handig. Misschien dat similar_text of soundex beter werken, zoals je zelf al aangaf.
Gewijzigd op 25/02/2012 11:52:46 door Jelmer -
@Jens erd
Ik ben bezig met een ticket service. Hierin worden vrij standaard berichten gemaakt en wil daaruit een samenvatting draaien met de relevante informatie.
Ik filter (met str_replace) daar wat tekst uitweg, maar mij valt op dat sommige deze standaard tekst net even wat anders neerzetten en of tikfouten maken.
Als ik dan met similar_text() die stukken tekst vergelijk, kom ik vaak op een overeenkomst van meer dan 95%, maar moet dus een combinatie hebben met zoeken opbasis van similar_text() en dan bij meer dan (bijv.) 95% een str_replace uitvoeren.
Begrijp je hem?
@Jelmer rrrr
Bedankt voor je reactie, ik ga er eens mee aan de slag.
Ik ben bezig met een ticket service. Hierin worden vrij standaard berichten gemaakt en wil daaruit een samenvatting draaien met de relevante informatie.
Ik filter (met str_replace) daar wat tekst uitweg, maar mij valt op dat sommige deze standaard tekst net even wat anders neerzetten en of tikfouten maken.
Als ik dan met similar_text() die stukken tekst vergelijk, kom ik vaak op een overeenkomst van meer dan 95%, maar moet dus een combinatie hebben met zoeken opbasis van similar_text() en dan bij meer dan (bijv.) 95% een str_replace uitvoeren.
Begrijp je hem?
@Jelmer rrrr
Bedankt voor je reactie, ik ga er eens mee aan de slag.




