#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, этот вычисляет сходство между двумя предложениями.