余弦相似度 算法

import java.util.ArrayList;
import java.util.List;

public class ComputerDecision {
//List<?> vector1 ;
//List<?> vector2 ;
List<Integer> vector1 = new ArrayList<Integer>();
List<Integer> vector2 = new ArrayList<Integer>();
static List<Double> vector3 = new ArrayList<Double>();
static List<Double> vector4 = new ArrayList<Double>();

public ComputerDecision(String string1, String string2) {
//把输入字符串中多个空格变为一个
String[] vector1String = string1.trim().replaceAll("\\s+", " ").split(" ");
String[] vector2String = string2.trim().replaceAll("\\s+", " ").split(" ");

for (String string : vector1String) {
vector1.add(Integer.parseInt(string));
}
for (String string : vector2String) {
vector2.add(Integer.parseInt(string));
}
}

public static void ComputerDecisiond1(String string1, String string2) {
//把输入字符串中多个空格变为一个
String[] vector1String = string1.trim().replaceAll("\\s+", " ").split(" ");
String[] vector2String = string2.trim().replaceAll("\\s+", " ").split(" ");

for (String string : vector1String) {
vector3.add(Double.valueOf(string));
}
for (String string : vector2String) {
vector4.add(Double.valueOf(string));
}
}

// 求余弦相似度
public double sim() {
double result = 0;
result = pointMulti(vector1, vector2) / sqrtMulti(vector1, vector2);

return result;
}
public static double simd() {
double result = 0;
result = pointMultid(vector3, vector4) / sqrtMultid(vector3, vector4);

return result;
}

private double sqrtMulti(List<Integer> vector1, List<Integer> vector2) {
double result = 0;
result = squares(vector1) * squares(vector2);
result = Math.sqrt(result);
return result;
}

private static double sqrtMultid(List<Double> vector1, List<Double> vector2) {
double result = 0;
result = squaresd(vector1) * squaresd(vector2);
result = Math.sqrt(result);
return result;
}

// 求平方和
private double squares(List<Integer> vector) {
double result = 0;
for (Integer integer : vector) {
result += integer * integer;
}
return result;
}
private static double squaresd(List<Double> vector) {
double result = 0;
for (Double integerd : vector) {
result += integerd * integerd;
}
return result;
}

// 点乘法
private double pointMulti(List<Integer> vector1, List<Integer> vector2) {
double result = 0;
for (int i = 0; i < vector1.size(); i++) {
result += vector1.get(i) * vector2.get(i);
}
return result;
}
private static double pointMultid(List<Double> vector1, List<Double> vector2) {
double result = 0;
for (int i = 0; i < vector1.size(); i++) {
result += vector1.get(i) * vector2.get(i);
}
return result;
}
public void ComputerDecisiond(String string1, String string2) {
//把输入字符串中多个空格变为一个
String[] vector1String = string1.trim().replaceAll("\\s+", " ").split(" ");
String[] vector2String = string2.trim().replaceAll("\\s+", " ").split(" ");

for (String string : vector1String) {
vector3.add( Double.valueOf(string.toString()));
}
for (String string : vector2String) {
vector4.add(Double.valueOf(string.toString()));
}
}
public static void main(String[] args) {

String string = "1 0 1 1 1 1 1 1 0 0 1 0 1 0 0 0 1 1 1 0 0 0 1";
String string2 ="1 0 1 1 1 1 1 1 0 1 0 0 0 1 0 0 1 1 1 0 0 0 1";
//String string3 = "5 7 9";
//String string4 = "5 9 9";

String string3 = "2.5 5.5 9.1 12.1 ";
String string4 = "1.5 5.4 9.0 12.2 ";
//ComputerDecision computerDecition = new ComputerDecisiond(string3,
// string4);
//System.out.println(computerDecition.sim());
ComputerDecisiond1(string3,
string4);
System.out.println(simd());

}
}

==========================================================

字符串

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class Cossimilar
{
/*
* 计算两个字符串(英文字符)的相似度,简单的余弦计算,未添权重
*/
public static double getSimilarDegree(String str1, String str2)
{
//创建向量空间模型,使用map实现,主键为词项,值为长度为2的数组,存放着对应词项在字符串中的出现次数
//Map<String, int[]> vectorSpace = new LinkedHashMap<String, int[]>();
Map<String, int[]> vectorSpace = new HashMap<String, int[]>();
int[] itemCountArray = null;//为了避免频繁产生局部变量,所以将itemCountArray声明在此

//以空格为分隔符,分解字符串
String strArray[] = str1.split(" ");
for(int i=0; i<strArray.length; ++i)
{
if(vectorSpace.containsKey(strArray[i]))
++(vectorSpace.get(strArray[i])[0]);
else
{
itemCountArray = new int[2];
itemCountArray[0] = 1;
itemCountArray[1] = 0;
vectorSpace.put(strArray[i], itemCountArray);
}
}

strArray = str2.split(" ");
for(int i=0; i<strArray.length; ++i)
{
if(vectorSpace.containsKey(strArray[i]))
++(vectorSpace.get(strArray[i])[1]);
else
{
itemCountArray = new int[2];
itemCountArray[0] = 0;
itemCountArray[1] = 1;
vectorSpace.put(strArray[i], itemCountArray);
}
}

//计算相似度
double vector1Modulo = 0.00;//向量1的模
double vector2Modulo = 0.00;//向量2的模
double vectorProduct = 0.00; //向量积
Iterator iter = vectorSpace.entrySet().iterator();

while(iter.hasNext())
{
Map.Entry entry = (Map.Entry)iter.next();
itemCountArray = (int[])entry.getValue();

vector1Modulo += itemCountArray[0]*itemCountArray[0];
vector2Modulo += itemCountArray[1]*itemCountArray[1];

vectorProduct += itemCountArray[0]*itemCountArray[1];
}

vector1Modulo = Math.sqrt(vector1Modulo);
vector2Modulo = Math.sqrt(vector2Modulo);

//返回相似度
return (vectorProduct/(vector1Modulo*vector2Modulo));
}

/*
*
*/
public static void mainxx(String args[])
{
String str1 = "gold silver truck";
String str2 = "Shipment of gold damaged in a fire";
String str3 = "Delivery of silver arrived in a silver truck";
String str4 = "Shipment of gold arrived in a truck";
String str5 = "gold gold gold gold gold gold";
String str6 = "gold gold gold gold gold dd";

System.out.println(Cossimilar.getSimilarDegree(str1, str2));
System.out.println(Cossimilar.getSimilarDegree(str1, str3));
System.out.println(Cossimilar.getSimilarDegree(str1, str4));
System.out.println(Cossimilar.getSimilarDegree(str1, str5));
System.out.println(Cossimilar.getSimilarDegree(str5, str6));
System.out.println(Cossimilar.getSimilarDegree(str6, str6));
}
}

时间: 2024-08-08 19:49:25

余弦相似度 算法的相关文章

【java算法】---余弦相似度计算字符串相似率

余弦相似度计算字符串相似率 功能需求:最近在做通过爬虫技术去爬取各大相关网站的新闻,储存到公司数据中.这里面就有一个技术点,就是如何保证你已爬取的新闻,再有相似的新闻 或者一样的新闻,那就不存储到数据库中.(因为有网站会去引用其它网站新闻,或者把其它网站新闻拿过来稍微改下内容就发布到自己网站中). 解析方案:最终就是采用余弦相似度算法,来计算两个新闻正文的相似度.现在自己写一篇博客总结下. 一.理论知识 先推荐一篇博客,对于余弦相似度算法的理论讲的比较清晰,我们也是按照这个方式来计算相似度的.网

相似度算法之余弦相似度

转自:http://blog.csdn.net/u012160689/article/details/15341303 余弦距离,也称为余弦相似度,是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小的度量. 余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,这就叫"余弦相似性". 上图两个向量a,b的夹角很小可以说a向量和b向量有很高的的相似性,极端情况下,a和b向量完全重合.如下图: 如上图二:可以认为a和b向量是相等的,也即a,b向量代表的文本是完全相似的,或

余弦方法计算相似度算法实现

http://blog.csdn.net/cscmaker/article/details/7990600 余弦方法计算相似度算法实现 (1)余弦相似性 通过测量两个向量之间的角的余弦值来度量它们之间的相似性.0度角的余弦值是1,而其他任何角度的余弦值都不大于1;并且其最小值是-1.从而两个向量之间的角度的余弦值确定两个向量是否大致指向相同的方向.所以,它通常用于文件比较. 详见百科介绍(点击打开链接) (2)算法实现的中未使用权重(IDF ---逆文档频率),使用词项的出现次数作为向量空间的值

推荐算法-余弦相似度

一.余弦相似度: 余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,这就叫"余弦相似性" 二维向量的余弦相似度: 多维向量的余弦相似度(类比) 协同过滤(Collaborative Filtering, 简称 CF): 收集用户行为 减噪与归一化处理 减噪:用户行为数据是用户在使用应用过程中产生的,它可能存在大量的噪音和用户的误操作,我们可以通过经典的数据挖掘算法过滤掉行为数据中的噪音,这样可以是我们的分析更加精确 归一化:将各个行为的数据统一在一个相同的取值范围中,从而使得

转:文本相似度算法

文本相似度算法 原文出自:http://www.cnblogs.com/liangxiaxu/archive/2012/05/05/2484972.html 1.信息检索中的重要发明TF-IDF 1.1TF Term frequency即关键词词频,是指一篇文章中关键词出现的频率,比如在一篇M个词的文章中有N个该关键词,则 (公式1.1-1) 为该关键词在这篇文章中的词频. 1.2IDF Inverse document frequency指逆向文本频率,是用于衡量关键词权重的指数,由公式 (公

余弦相似度应用

http://www.ruanyifeng.com/blog/2013/03/tf-idf.html TF-IDF与余弦相似性的应用(一):自动提取关键词 http://www.ruanyifeng.com/blog/2013/03/cosine_similarity.html TF-IDF与余弦相似性的应用(二):找出相似文章 http://www.ruanyifeng.com/blog/2013/03/automatic_summarization.html TF-IDF与余弦相似性的应用(

Python简单实现基于VSM的余弦相似度计算

在知识图谱构建阶段的实体对齐和属性值决策.判断一篇文章是否是你喜欢的文章.比较两篇文章的相似性等实例中,都涉及到了向量空间模型(Vector Space Model,简称VSM)和余弦相似度计算相关知识.        这篇文章主要是先叙述VSM和余弦相似度相关理论知识,然后引用阮一峰大神的例子进行解释,最后通过Python简单实现百度百科和互动百科Infobox的余弦相似度计算. 一. 基础知识 第一部分参考我的文章: 基于VSM的命名实体识别.歧义消解和指代消解 第一步,向量空间模型VSM 

Jackcard类似度和余弦类似度(向量空间模型)的java实现

版权声明:本文为博主原创文章,地址:http://blog.csdn.net/napoay,转载请留言. 总结Jackcard类似度和余弦类似度. 一.集合的Jackcard类似度 1.1Jackcard类似度 Jaccard类似指数用来度量两个集合之间的类似性,它被定义为两个集合交集的元素个数除以并集的元素个数. 数学公式描写叙述: J(A,B)=|A∩B||A∪B| 这个看似简单的算法有非常大的用处.比方: 抄袭文档 高明的抄袭者为了掩盖自己抄袭的事实,会选择性的抄袭文档中的一些段落,或者对

&lt;tf-idf + 余弦相似度&gt; 计算文章的相似度

背景知识: (1)tf-idf 按照词TF-IDF值来衡量该词在该文档中的重要性的指导思想:如果某个词比较少见,但是它在这篇文章中多次出现,那么它很可能就反映了这篇文章的特性,正是我们所需要的关键词. tf–idf is the product of two statistics, term frequency and inverse document frequency. //Various ways for determining the exact values of both stati