вычислить подобие косинуса

#java #jdbc

#java #jdbc

Вопрос:

Как я могу вычислить подобие косинуса, чтобы завершить мой проект поисковой системы, используя jdbc. У меня есть запрос частоты термина таблицы для хранения входных данных от пользователя и документ частоты термина таблицы для хранения всей информации о документе, я выполнил запрос вычисления и взвешенный документ. выводом после вычисления подобия косинуса является отображение того, какой документ связан с запросом из пользовательского ввода. У меня нет никакой идеи, и я не знаю, как это вычислить, потому что это связано с таблицей в базе данных.

Комментарии:

1. Я не понимаю вашего вопроса. Вы спрашиваете, как запрашивать таблицу? Пожалуйста, сформулируйте свой вопрос более конкретно и, возможно, приведите один или два примера.

2. хорошо, пользователь должен ввести запрос, и результат, который пользователь получает, получен из данных, которые я храню в табличном документе. у меня есть таблица, tf_query и tf_doc, tf_query хранят данные от пользователя, а tf_doc хранят данные о документе. я выполнил вычисление tf-idf и взвешенного, и теперь мне нужно вычислить подобие косинуса.

3. например: пользователь вводит, как дела? и результат — как дела, дорогой, который хранится в табличном документе 1 и документе 2

4. означает вычислить сходство между запросом и документом…

5. Я не думаю, что будет возможно вычислить подобие косинуса из простого запроса SELECT, поскольку подобие косинуса будет включать умножение матрицы. Вам нужно будет ВЫБРАТЬ все документы, содержащие термины запроса, извлечь их векторы терминов, а затем выполнить умножение на вашем прикладном уровне.

Ответ №1:

это программа, которая вычисляет сходство косинусов между двумя предложениями. Я надеюсь, вы сможете внести необходимые изменения, чтобы получить то, что вы хотите.

 import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
 * 
* @author Xiao Ma
* mail : 409791952@qq.com
*`enter code here`
*/
  public class SimilarityUtil {

public static double consineTextSimilarity(String[] left, String[] right) {
    Map<String, Integer> leftWordCountMap = new HashMap<String, Integer>();
    Map<String, Integer> rightWordCountMap = new HashMap<String, Integer>();
    Set<String> uniqueSet = new HashSet<String>();
    Integer temp = null;
    for (String leftWord : left) {
        temp = leftWordCountMap.get(leftWord);
        if (temp == null) {
            leftWordCountMap.put(leftWord, 1);
            uniqueSet.add(leftWord);
        } else {
            leftWordCountMap.put(leftWord, temp   1);
        }
    }
    for (String rightWord : right) {
        temp = rightWordCountMap.get(rightWord);
        if (temp == null) {
            rightWordCountMap.put(rightWord, 1);
            uniqueSet.add(rightWord);
        } else {
            rightWordCountMap.put(rightWord, temp   1);
        }
    }
    int[] leftVector = new int[uniqueSet.size()];
    int[] rightVector = new int[uniqueSet.size()];
    int index = 0;
    Integer tempCount = 0;
    for (String uniqueWord : uniqueSet) {
        tempCount = leftWordCountMap.get(uniqueWord);
        leftVector[index] = tempCount == null ? 0 : tempCount;
        tempCount = rightWordCountMap.get(uniqueWord);
        rightVector[index] = tempCount == null ? 0 : tempCount;
        index  ;
    }
    return consineVectorSimilarity(leftVector, rightVector);
}

/**
 * The resulting similarity ranges from −1 meaning exactly opposite, to 1
 * meaning exactly the same, with 0 usually indicating independence, and
 * in-between values indicating intermediate similarity or dissimilarity.
 * 
 * For text matching, the attribute vectors A and B are usually the term
 * frequency vectors of the documents. The cosine similarity can be seen as
 * a method of normalizing document length during comparison.
 * 
 * In the case of information retrieval, the cosine similarity of two
 * documents will range from 0 to 1, since the term frequencies (tf-idf
 * weights) cannot be negative. The angle between two term frequency vectors
 * cannot be greater than 90°.
 * 
 * @param leftVector
 * @param rightVector
 * @return
 */
private static double consineVectorSimilarity(int[] leftVector,
        int[] rightVector) {
    if (leftVector.length != rightVector.length)
        return 1;
    double dotProduct = 0;
    double leftNorm = 0;
    double rightNorm = 0;
    for (int i = 0; i < leftVector.length; i  ) {
        dotProduct  = leftVector[i] * rightVector[i];
        leftNorm  = leftVector[i] * leftVector[i];
        rightNorm  = rightVector[i] * rightVector[i];
    }

    double result = dotProduct
            / (Math.sqrt(leftNorm) * Math.sqrt(rightNorm));
    return resu<
}

public static void main(String[] args) {
    String left[] = { "Julie", "loves", "me", "more", "than", "Linda",
            "loves", "me" };
    String right[] = { "Jane", "likes", "me", "more", "than", "Julie",
            "loves", "me" };
    System.out.println(consineTextSimilarity(left,right));
}
}
  

Комментарии:

1. если вы можете изменить программу, пожалуйста, пожалуйста, помогите мне, потому что мне это тоже нужно, но я пытался вычислить сходство между двумя словами или более, но он продолжал выдавать мне 0, этот вычисляет сходство между двумя предложениями.