Calculer le score de similarité des chaînes de caractères avec JAVA

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).

Méthode de distance de Levenstein

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. ** **

Méthode de distance Jaro Winkler

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 **

la mise en oeuvre

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

Calculer le score de similarité des chaînes de caractères avec JAVA
CI l'architecture des applications Java / Kotlin avec ArchUnit
Surveillez l'état interne des programmes Java avec Kubernetes
Vérifiez le comportement de Java Intrinsic Locks avec bpftrace
L'histoire de la création de DTO, semblable à Dao avec Java, SQLite
Remplacez seulement une partie de l'hôte URL par java
Trier les chaînes comme une fonction caractéristique avec Java
Assurez-vous de comparer le résultat Java compareTo avec 0
[Java] Supprimer les éléments de la liste
Suivez le lien avec Selenium (Java)
L'origine des expressions Java lambda
Essayez HelloWorld avec la configuration minimale de Heroku Java spring-boot
Une histoire sur l'utilisation de l'API League Of Legends avec JAVA
Le point addictif lors de l'authentification de base avec Java URLConnection
Écraser le téléchargement du fichier avec le même nom avec BOX SDK (java)
La version d'Elasticsearch que vous utilisez est-elle compatible avec Java 11?
Obtenez le résultat de POST en Java
Vérifiez le contenu du magasin de certificats Java
Vérifiez le contenu des paramètres avec le levier
Examiner l'utilisation de la mémoire des éléments Java
L'histoire de la création d'un lanceur de jeu avec une fonction de chargement automatique [Java]
[Java] Obtenez le jour d'un jour spécifique
Mémo: [Java] Vérifiez le contenu du répertoire
Comparer les éléments d'un tableau (Java)
Comment convertir un tableau de chaînes en un tableau d'objets avec l'API Stream
[jour: 5] J'ai résumé les bases de Java
Quelles sont les fonctionnalités mises à jour de Java 13
Mesurez facilement la taille des objets Java
Retour sur les bases de Java
[Java] Précautions lors de la comparaison de chaînes de caractères avec des chaînes de caractères
Sortie du livre "Introduction à Java"
À propos du traitement de BigDecimal (avec réflexion)
Vérifiez l'enregistrement MX de l'adresse e-mail avec java et vérifiez le domaine
L'histoire de l'écriture de Java dans Emacs
Mettre en forme le contenu de LocalDate avec DateTimeFormatter
[Java] Vérifiez le nombre d'occurrences de caractères
[Java] [Spring] Tester le comportement de l'enregistreur
Essayez d'utiliser la télécommande Wii en Java
[Java] Récupère MimeType à partir du contenu du fichier avec Apathce Tika [Kotlin]
[Java] Obtenez la date avec la classe LocalDateTime
Incrémenté du troisième argument de la méthode iterate de la classe Stream ajoutée depuis Java9
Briser de force le problème C "* 3 ou / 2" de [AtCoder Problem-ABC100] avec Java [Code]
Valider le jeton d'ID d'un utilisateur authentifié par AWS Cognito en Java
[Java] Calculer le jour à partir de la date (ne pas utiliser la classe Calendar)
L'histoire de la comparaison de chaînes de bas niveau en Java
[Java] Gestion des Java Beans dans la chaîne de méthodes
JAVA: jar, aar, affichez le contenu du fichier
[java] Résumé de la gestion des chaînes de caractères
L'histoire de la fabrication d'un Othello ordinaire à Java
[Android] [Java] Gérer l'état de CheckBox de ListView
Vérifiez le contenu de l'objet argument avec Mockito
A propos de l'ordre de description des propriétés système Java
[LeJOS] Contrôlons le moteur EV3 avec Java
À propos de l'idée des classes anonymes en Java
L'ordre des modificateurs de méthode Java est fixe
[Java] Réglez l'heure depuis le navigateur avec jsoup
[Java] Accéder à l'URL signée de s3 (version signée 2)
L'histoire de l'apprentissage de Java dans la première programmation
Comprendre le framework MVC avec Java 1/4 View côté serveur
[Java] Obtenir la longueur de la chaîne de paire de substitution