相似度分析的,其中的分词可以采用HanLP即可:

http://www.open-open.com/lib/view/open1421978002609.htm

/***********************************************************
* @Title : SimilarityAnalyse.java
* @Package : lsg.hawei.hanlp
* @Description: TODO(用一句话描述该文件做什么)
* @author : liang shan guang
* @date :2016年11月8日 上午12:41:10
* @version : V1.0
***********************************************************/
package lsg.hawei.hanlp; import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Vector; import com.hankcs.hanlp.HanLP;
import com.hankcs.hanlp.dictionary.CustomDictionary;
import com.hankcs.hanlp.seg.Segment;
import com.hankcs.hanlp.seg.common.Term; import edu.princeton.cs.algs4.In; /***********************************************************
* @ClassName : SimilarityAnalyse
* @Description : 用于相似度分析的库函数
* @author :liang shan guang
* @date :2016年11月8日 上午12:41:10
***********************************************************/
public class SimilarityAnalyse
{
//阈值,用于决定语言分析和语序分析占相似度的百分比,此处0.2为语已占比
public static double YUZHI = 0.2 ;
public static Vector<String> participle( String str )
{ Vector<String> str1 = new Vector<String>() ;//对输入进行分词
Segment segment=HanLP.newSegment().enableCustomDictionary(true);
CustomDictionary.add("梁山广");//动态添加自定义词汇
List<Term> termList=segment.seg(str);
for(Term term:termList)
{
// System.out.println(term.toString());
str1.add(term.toString());
} if( str1.size() == 0 )
{
return null ;
} //分词后
System.out.println( "str分词后:" + str1 );
return str1;
} public static double getSimilarity(Vector<String> T1, Vector<String> T2) throws Exception
{
int size = 0 , size2 = 0 ;
if ( T1 != null && ( size = T1.size() ) > 0 && T2 != null && ( size2 = T2.size() ) > 0 ) { Map<String, double[]> T = new HashMap<String, double[]>(); //T1和T2的并集T
String index = null ;
for ( int i = 0 ; i < size ; i++ ) {
index = T1.get(i) ;
if( index != null){
double[] c = T.get(index);
c = new double[2];
c[0] = 1; //T1的语义分数Ci
c[1] = YUZHI;//T2的语义分数Ci
T.put( index, c );
}
} for ( int i = 0; i < size2 ; i++ ) {
index = T2.get(i) ;
if( index != null ){
double[] c = T.get( index );
if( c != null && c.length == 2 ){
c[1] = 1; //T2中也存在,T2的语义分数=1
}else {
c = new double[2];
c[0] = YUZHI; //T1的语义分数Ci
c[1] = 1; //T2的语义分数Ci
T.put( index , c );
}
}
} //开始计算,百分比
Iterator<String> it = T.keySet().iterator();
double s1 = 0 , s2 = 0, Ssum = 0; //S1、S2
while( it.hasNext() ){
double[] c = T.get( it.next() );
Ssum += c[0]*c[1];
s1 += c[0]*c[0];
s2 += c[1]*c[1];
}
//百分比
return Ssum / Math.sqrt( s1*s2 );
} else {
throw new Exception("传入参数有问题!");
}
} /*************************************************************
* @Title : main
* @Description: TODO(这里用一句话描述这个方法的作用)
* @param : @param args 设定文件
* @return :void 返回类型
* @throws
*************************************************************/
public static void main(String[] args)
{
String currentFolder = System.getProperty("user.dir");
String fileFolder = currentFolder+"\\file\\";
String fileName1 = fileFolder+"wait2Compare.txt";//读入待分析的数据
String fileName2 = fileFolder+"standardStrs.txt";//读入标准的数据
String[] wait2Compare=In.readStrings(fileName1);
String[] standardStrs=In.readStrings(fileName2);
for(String str1:wait2Compare)
{
for(String str2:standardStrs)
{
Vector<String> testLine1=participle(str1);
Vector<String> testLine2=participle(str2);
try
{
double similarity=getSimilarity(testLine1,testLine2);
System.out.println("两个句子的相似度为:"+similarity);
} catch (Exception e)
{
// TODO Auto-generated catch block
System.out.println("相似度 计算失败,失败原因如下:");
e.printStackTrace();
}
}
} } }

相似度分析,循环读入文件(加入了HanLP,算法第四版的库)的更多相关文章

  1. 算法第四版中 while (!StdIn.isEmpty()) 循环无法跳出问题

    在IDEA中使用Ctrl+D就可以退出console输入

  2. Java利用hanlp完成语句相似度分析的案例详解

    分享一篇hanlp分词工具使用的小案例,即利用hanlp分词工具分析两个中文语句的相似度的案例.供大家一起学习参考! 在做考试系统需求时,后台题库系统提供录入题目的功能.在录入题目的时候,由于题目来源 ...

  3. 文本离散表示(三):TF-IDF结合n-gram进行关键词提取和文本相似度分析

    这是文本离散表示的第二篇实战文章,要做的是运用TF-IDF算法结合n-gram,求几篇文档的TF-IDF矩阵,然后提取出各篇文档的关键词,并计算各篇文档之间的余弦距离,分析其相似度. TF-IDF与n ...

  4. 八大排序算法详解(动图演示 思路分析 实例代码java 复杂度分析 适用场景)

    一.分类 1.内部排序和外部排序 内部排序:待排序记录存放在计算机随机存储器中(说简单点,就是内存)进行的排序过程. 外部排序:待排序记录的数量很大,以致于内存不能一次容纳全部记录,所以在排序过程中需 ...

  5. 八大排序算法——基数排序(动图演示 思路分析 实例代码java 复杂度分析)

    一.动图演 二.思路分析 基数排序第i趟将待排数组里的每个数的i位数放到tempj(j=1-10)队列中,然后再从这十个队列中取出数据,重新放到原数组里,直到i大于待排数的最大位数. 1.数组里的数最 ...

  6. 八大排序算法——归并排序(动图演示 思路分析 实例代码java 复杂度分析)

    一.动图演示 二.思路分析 归并排序就是递归得将原始数组递归对半分隔,直到不能再分(只剩下一个元素)后,开始从最小的数组向上归并排序 1.  向上归并排序的时候,需要一个暂存数组用来排序, 2.  将 ...

  7. 八大排序算法——快速排序(动图演示 思路分析 实例代码Java 复杂度分析)

    一.动图演示 二.思路分析 快速排序的思想就是,选一个数作为基数(这里我选的是第一个数),大于这个基数的放到右边,小于这个基数的放到左边,等于这个基数的数可以放到左边或右边,看自己习惯,这里我是放到了 ...

  8. 6.3 基于二分搜索树、链表的实现的集合Set复杂度分析

    两种集合类的复杂度分析 在[6.1]节与[6.2]节中分别以二分搜索树和链表作为底层实现了集合Set,在本节就两种集合类的复杂度分析进行分析:测试内容:6.1节与6.2节中使用的书籍.测试方法:测试两 ...

  9. 八大排序算法——插入排序(动图演示 思路分析 实例代码java 复杂度分析)

    一.动图演示 二.思路分析 例如从小到大排序: 1.  从第二位开始遍历, 2.  当前数(第一趟是第二位数)与前面的数依次比较,如果前面的数大于当前数,则将这个数放在当前数的位置上,当前数的下标-1 ...

随机推荐

  1. 有限状态机(FSM)

    在游戏开发中,AI是个永恒不变的话题,如果你要的AI只是很简单的一个逻辑 那么有限状态机是一个很好的解决方案,尽管在实际开发中,AI的设计并不是一个简单的逻辑, 如果用有限状态机,维护起来会非常麻烦, ...

  2. 有了门面,程序会更加体面!- pos软件基于三层架构 -09

    续上篇)        大鸟说道:“实际上没有学过设计模式去理解三层架构会有失偏颇的,毕竟分层是更高一级别的模式,所谓的架构模式.不过在程序中,有意识的遵循设计原则,却也可以有效的做出好的设计.”   ...

  3. 转:ibatis动态sql

    转:ibatis动态sql 直接使用JDBC一个非常普遍的问题就是动态SQL.使用参数值.参数本身和数据列都是动态SQL,通常是非常困难的.典型的解决办法就是用上一堆的 IF-ELSE条件语句和一连串 ...

  4. ios 单例设计模式

    单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类.单例可用性非常高,用于登录用户管理等可供全局调用. + (AccountMa ...

  5. *HDU3635 并查集

    Dragon Balls Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  6. 谢欣伦 - OpenDev原创教程 - 客户端套接字类CxClientSocket

    这是一个精练的客户端套接字类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxClientSocket的使用如下(以某个叫做CSo ...

  7. Run P4 without P4factory - A Simple Example In Tutorials.

    前言 本文是我运行P4社区于Github开源教程Tutorials中的P4 SIGCOMM 2015 Tutorial一些实战小结,Github链接: Github. 测试的例子:P4 SIGCOMM ...

  8. jQuery File Upload 单页面多实例的实现

    jQuery File Upload 的 GitHub 地址:https://github.com/blueimp/jQuery-File-Upload 插件描述:jQuery File Upload ...

  9. 如何在eclipse将程序导出成jar文件

    如何在eclipse将程序导出成jar文件 听语音 | 浏览:916 | 更新:2015-08-22 17:57 1 2 3 4 5 6 7 分步阅读 一键约师傅 百度师傅为你的电脑系统,选个靠谱师傅 ...

  10. ajax下载多文件,并且打包 C#中 ,文件批下载zip

    //提交要下载的文件 $.ajax({ url:"/sub/ZipFile.aspx", data:"paras="+datas, type: 'HEAD', ...