Vous pouvez le faire tout de suite avec apache lucene. Vous pouvez le faire en une seule ligne. Il existe la méthode de la distance de Levenstein et la méthode de la distance de Jaro Winkler (bien qu'il y en ait d'autres).
Combien de fois dois-je modifier = distance. Lors du remplacement de "BitCoin Core" par "BitCoin Cash"
1ère fois: "BitCoin C [a] re" Deuxième fois: "BitCoin Ca [s] e" Troisième fois: "BitCoin Cas [h]"
Par conséquent, la distance est de "3".
Dans ce cas, le nombre de caractères est de 12 caractères. 9 caractères sur 12 n'ont pas besoin d'être modifiés Le score est de 9/12 = 3/4 = 0,75, soit 75 points.
** Généralement, on dit qu'il est facile à utiliser pour la vérification orthographique et antivol. ** **
Je mesure aussi la similitude Par exemple, la similitude est calculée comme s'il y avait des caractères qui peuvent être remplacés dans une certaine plage.
En outre, la correspondance des préfixes est également prise en compte lors du calcul de la similitude.
** Généralement, il est réputé efficace pour vérifier les fautes d'orthographe **
Ne comptez que sur Lucene. Chez Maven.
pom.xml
<dependency>
<artifactId>lucene-core</artifactId>
<groupId>org.apache.lucene</groupId>
<version>5.1.0</version>
</dependency>
<dependency>
<artifactId>lucene-analyzers</artifactId>
<groupId>org.apache.lucene</groupId>
<version>3.6.1</version>
</dependency>
<dependency>
<artifactId>lucene-spellchecker</artifactId>
<groupId>org.apache.lucene</groupId>
<version>3.6.1</version>
</dependency>
sample
import org.apache.lucene.search.spell.JaroWinklerDistance;
import org.apache.lucene.search.spell.LevensteinDistance;
/**
*Échantillon pour calculer le score de similitude d'une chaîne de caractères
* @author ryutaro_hakozaki
*/
public class ExecStringSimilaritySample {
public static void main(String argv[]){
System.out.println(
"Un score comparant "BitCoin Core" et "BitCoin Cash" par distance de Levenstein== "
+ getSimilarScoreByLevenshteinDistance("BitCoin Core", "BitCoin Cash"));
System.out.println(
"Jaro Winkler Score comparant "BitCoin Core" et "BitCoin Cash" à distance== "
+ getSimilarScoreByJaroWinklerDistance("BitCoin Core", "BitCoin Cash"));
}
/**
*La distance de Revenstein détermine la similitude des chaînes
* @param s1
* @param s2
* @return
*/
private static int getSimilarScoreByLevenshteinDistance(String s1, String s2){
//Le contrôle d'entrée est omis
LevensteinDistance dis = new LevensteinDistance();
return (int) (dis.getDistance(s1, s2) * 100);
}
/**
*Jaro Winkler juge la similitude des cordes en fonction de la distance
* @param s1
* @param s2
* @return
*/
private static int getSimilarScoreByJaroWinklerDistance(String s1, String s2){
//Le contrôle d'entrée est omis
JaroWinklerDistance dis = new JaroWinklerDistance();
return (int) (dis.getDistance(s1, s2) * 100);
}
}
Résultat d'exécution
Un score comparant "BitCoin Core" et "BitCoin Cash" par distance de Levenstein== 75
Jaro Winkler Distance score comparant "BitCoin Core" et "BitCoin Cash"== 95
Recommended Posts