简单实现根据Td-idf实现语句相似度
2017-04-28 15:25
330 查看
使用词频来计算两个语句的相似度,假设语句已经使用分词工具分好
public class Similar {
public static double getSimilarity(Vector<String> T1, Vector<String> T2) throws Exception {
int size = 0 , size2 = 0 ;
double sum=0;
if ( T1 != null && ( size = T1.size() ) > 0 && T2 != null && ( size2 = T2.size() ) > 0 ) {
Set<String> set=new HashSet<String>();
Map<String, Integer> s1 = new HashMap<String, Integer>();
Map<String, Integer> s2= new HashMap<String, Integer>();
//获取T1,T2所有的不重复单词
for (int i = 0; i < size; i++) {
set.add(T1.get(i));
}
for(int j=0;j<size2;j++){
set.add(T2.get(j));
}
//计算每个向量中的词语出现的次数
for (String string : set) {
int count=0;
int count1=0;
for (String a1 : T1) {
if (a1.equals(string)) {
count++;
}
}
for (String a2 : T2) {
if (a2.equals(string)) {
count1++;
}
}
s1.put(string, count);
s2.put(string, count1);
}
//计算百分比
int c1 = 0 , c2 = 0;
double sum1 = 0; //S1、S2
double b1=0,b2=0;
for (String string : set) {
c1=s1.get(string);
c2=s2.get(string);
sum1+=c1*c2;
b1+=c1*c1;
b2+=c2*c2;
}
sum=sum1/Math.sqrt(b1*b2);
}else {
System.out.println("参数有误");
}
return sum;
}
public static void main(String[] args) {
Vector<String> T1 = new Vector<String>() ;//对输入进行分词
Vector<String> T2 = new Vector<String>() ;//对输入进行分词
T1.add("i");
T1.add("kill");
T1.add("you");
T1.add("kill");
T1.add("you");
T1.add("fop");
T1.add("tip");
T1.add("cnce");
T2.add("kill");
T2.add("you");
try {
System.out.println(getSimilarity(T1, T2));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class Similar {
public static double getSimilarity(Vector<String> T1, Vector<String> T2) throws Exception {
int size = 0 , size2 = 0 ;
double sum=0;
if ( T1 != null && ( size = T1.size() ) > 0 && T2 != null && ( size2 = T2.size() ) > 0 ) {
Set<String> set=new HashSet<String>();
Map<String, Integer> s1 = new HashMap<String, Integer>();
Map<String, Integer> s2= new HashMap<String, Integer>();
//获取T1,T2所有的不重复单词
for (int i = 0; i < size; i++) {
set.add(T1.get(i));
}
for(int j=0;j<size2;j++){
set.add(T2.get(j));
}
//计算每个向量中的词语出现的次数
for (String string : set) {
int count=0;
int count1=0;
for (String a1 : T1) {
if (a1.equals(string)) {
count++;
}
}
for (String a2 : T2) {
if (a2.equals(string)) {
count1++;
}
}
s1.put(string, count);
s2.put(string, count1);
}
//计算百分比
int c1 = 0 , c2 = 0;
double sum1 = 0; //S1、S2
double b1=0,b2=0;
for (String string : set) {
c1=s1.get(string);
c2=s2.get(string);
sum1+=c1*c2;
b1+=c1*c1;
b2+=c2*c2;
}
sum=sum1/Math.sqrt(b1*b2);
}else {
System.out.println("参数有误");
}
return sum;
}
public static void main(String[] args) {
Vector<String> T1 = new Vector<String>() ;//对输入进行分词
Vector<String> T2 = new Vector<String>() ;//对输入进行分词
T1.add("i");
T1.add("kill");
T1.add("you");
T1.add("kill");
T1.add("you");
T1.add("fop");
T1.add("tip");
T1.add("cnce");
T2.add("kill");
T2.add("you");
try {
System.out.println(getSimilarity(T1, T2));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
相关文章推荐
- word2Vec--(1) nltk实现简单的切词,情感分析,文本相似度(TF-IDF)
- SQL语句技巧--复杂逻辑的SQL简单实现(1)
- 简单的实现分页获取数据的sql语句
- 一段多个access表汇总的简单样例 (备忘 根据情况修改相应代码可实现excel多表入access汇总)
- 收藏一个简单sql语句实现多查询的方法
- 使用java简单实现根据输入的汉字,得到汉字的首字母
- sql 语句实现简单查询和复杂查询
- 用switch-case语句实现两个数的简单四则运算
- boost 中的模板多参数根据N来提取第N个参数的类型 (tuple的实现中用到) tuple的自己的简单实现,仅带get方法
- 简单SQL语句实现分页效果
- 游戏引擎AndEngine总结(七):用AndEngine简单实现根据二维数组生成地图(Mappy原理)
- 实现分页的简单sql语句
- 提供了根据表中的数据自动生成insert语句的数据库包,还提供了一些简单的工具
- 利用反射+特性实现简单的实体映射数据库操作类(还未做自动生成SQL语句部分)
- php实现 带通配符的根据前后字符串截取的简单方法
- SQL语句技巧--复杂逻辑的SQL简单实现(2)
- 一个iBATIS的简单实现(含sql语句中表名等的动态传入)
- 根据RemObject的远程方法调用原理实现的简单远程方法调用
- Levenshtein Distance算法实现简单文本相似度分析
- 根据权重随机选取指定条数记录的简单算法实现(C#)【含源代码】