2017-05-28 4 views
0

J'ai besoin de comparer les tableaux ci-dessous et de vérifier s'il existe des mots similaires et s'il y a des mots similaires, alors effectuez une autre tâche. Ici pour tockanization j'ai utilisé Apache open NLP.Comment comparer ci-dessous 2 tableaux pour trouver s'il existe des mots simmiler?

import opennlp.tools.tokenize.SimpleTokenizer; 
public class SimpleTokenizerExample { 
    public static void main(String args[]){ 

     String description = "This Book is about java Technologies"; 

     String request = "I need a java book" ; 

     //Instantiating SimpleTokenizer class 
     SimpleTokenizer simpleTokenizer = SimpleTokenizer.INSTANCE; 

     //Tokenizing the given sentence 

     String tokens[] = simpleTokenizer.tokenize(description); 

     String tokens2[]= simpleTokenizer.tokenize(request); 

     //Printing the tokens 
     for(String token : tokens) {   
     System.out.println(token); 
     } 

     System.out.println("\n"); 

    //Printing the tokens 
     for(String token : tokens2) { 

     System.out.println(token); 
     }`` 

}} 

La sortie est comme ci-dessous:

Ce

Livre

est

à propos

java

Tech nologies

Je

besoin

un

java

livre

+0

Vous souhaitez compter le nombre de chaînes sont égales entre deux tableaux de chaîne? Si c'est le cas, utilisez une boucle for imbriquée. Pour chaque chaîne du tableau n ° 1, parcourez toutes les chaînes du tableau n ° 2 et vérifiez si chaque chaîne du tableau n ° 1 est égale (en utilisant la fonction égale pour la chaîne au lieu de "==") toute chaîne du tableau n ° 2 – JYun

Répondre

0

Une façon de le faire est d'utiliser une distance de base ou une fonction similitude sur les vecteurs. Dans ce cas, vous avez ce que l'on appelle parfois des "vecteurs à terme". Donc, fondamentalement, je vous suggère de faire un Map<String,Double> sur vos tableaux de chaînes, puis utilisez cette fonction ci-dessous (similitude cosinus) pour les comparer.

private Double compare(Map<String, Double> a, Map<String, Double> b) { 
    Set<String> keys = new HashSet<>(); 
    keys.addAll(a.keySet()); 
    keys.addAll(b.keySet()); 
    Double dot = 0d, magA = 0d, magB = 0d; 
    for (String key : keys) { 
     Double aVal = a.get(key) == null ? 0d : a.get(key); 
     Double bVal = b.get(key) == null ? 0d : b.get(key); 
     magA += Math.pow(aVal, 2); 
     magB += Math.pow(bVal, 2); 
     dot += aVal * bVal; 
    } 
    if (dot == 0d) { 
     return 0d; 
    } 
    Double div = Math.sqrt(magA) * Math.sqrt(magB); 
    if (div == 0d) { 
     return 0d; 
    } 
    return dot/div; 
    } 

alors vous feriez quelque chose comme ça pour l'appeler sur vos deux tableaux de chaînes

private static void compare(String[] a, String[] b) { 
    Map<String, Double> ma = new HashMap<>(); 
    Map<String, Double> mb = new HashMap<>(); 

    for (String s : a) { 
     if (ma.containsKey(s)) { 
     ma.put(s, ma.get(s) + 1); 
     } else { 
     ma.put(s, 1d); 
     } 
    } 
    for (String s : b) { 
     if (mb.containsKey(s)) { 
     mb.put(s, mb.get(s) + 1); 
     } else { 
     mb.put(s, 1d); 
     } 
    } 

    Double score = compare(ma, mb); 

    } 

bonne chose à propos de similarité cosinus est qu'il retourne toujours une valeur comprise entre 0 et 1. Vous pouvez utiliser distance vecteur euclidienne, ou distance de Manhattan etc, mais ils ne produisent pas une belle distribution comme celle-ci.

Les calculs mathématiques multidimensionnels vont changer votre façon de penser le codage!

HTH

MG