IKAnalyzer中文分词,计算句子相似度

标签: 算法 | 发表时间:2015-01-22 17:57 | 作者:
出处:http://my.oschina.net/twosnail

IKAnalyzer中文分词,计算句子相似度

一、简介

    IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。独立于Lucene项目,同时提供了对Lucene的默认优化实现。(简介来源: 百度百科

二、准备

    项目结构:

    

     IKAnalyzer2012FF_u1.jar 下载

     lucene-core-4.6.1.jar 下载

    ext.dic

    stopword.dic

    IKAnalyzer.cfg.xml

三、分词

    分词由于比较简单,就直接粘贴代码了

public static Vector<String> participle( String str ) {
	
	Vector<String> str1 = new Vector<String>() ;//对输入进行分词
	
	try {
		
	    StringReader reader = new StringReader( str ); 
	    IKSegmenter ik = new IKSegmenter(reader,true);//当为true时,分词器进行最大词长切分 
	    Lexeme lexeme = null ;			
		
	    while( ( lexeme = ik.next() ) != null ) {
		str1.add( lexeme.getLexemeText() ); 
	    }			
		
	    if( str1.size() == 0 ) {
	    	return null ;
	    }
	    
 	    //分词后
	    System.out.println( "str分词后:" + str1 );
	    
	} catch ( IOException e1 ) {
		System.out.println();
	}
	return str1;
}


四、计算相似度

    计算句子相似度,①常用方法有基于语义和词序相似度计算方法,②基于关系向量模型

    基于语义和词序的句子相似度计算方法简介

    定义1:给定一个句子Ti,经过汉语分词系统分词后,得到的所有词W1构成的向量称为句子Ti的向量表示,表示为Ti = {w1,w2,.....wn}。

     例子1:T1:这个中文分词可不可以,用着方不方便。分词后:T1=[这个, 中文分词, 可不可以, 用着, 方, 不, 方便]。向量表示T1={这个, 中文分词, 可不可以, 用着, 方, 不, 方便}

                T2:这个中文分词比较方便,用着方便还可以。分词后:T2=[这个, 中文分词, 比较方便, 用着, 方便, 还可以]。向量表示T2={这个, 中文分词, 比较方便, 用着, 方便, 还可以}

    定义2:给定一个句子Ti的向量表示,Ti中词的个数称为Ti的向量长度,表示为Len(Ti).

     例子2:对于句子T1和T2的向量长度表示为:Len(T1)=7,Len(T1)=6。

    定义3:给定两个句子Ti、Tj的向量表示,将Ti、Tj中的所有词Wi进行合并,并且对于重复初想的词只保留一个,由此得到两个向量之和,称为Ti、Tj的并集,表示T=T1 U T2={这个, 中文分词, 可不可以, 比较方便,用着, 方, 不, 方便,还可以},很显然,并集长度Len(T)<=Len(T1)+Len(T2)。

    定义4:给定一个句子Ti的向量表示Ti = {w1,w2,.....wn}和一个词wi,依次计算wi和Ti中每一个词的相似度(值为0到1之间),所以所有结果中的最大值称为wi在Ti中的语义分数,表示为Ci。

    定义5:给定两个句子Ti、Tj的向量表示,Ti和Tj的集合T={w1、w2,....wn},对T中的每一个词Wi,计算Wi在Ti中的语义分数Ci,T中每个分词的语义分数组成的一个向量称为Ti基于T的语义向量,表示为Si={C1,C2,...,Cn}。

           在该算法中,基于T分别计算Ti和Tj的语义向量Si、Sj,以计算Si作为说明,过程如下:

    1、对于T中的每一个词wi,如果wi 在Ti 中出现,则在语义向量Si中将wi 的语义分数Ci设为1。

    2、如果Ti中不包含wi,则计算wi 在 Ti 中的语义分数 Ci=a(a为预先设定的阈值 , 无阈值设为0 ,本文中阈值为0.2 ) 。

        根据语义向量计算语义相似度方法如下图:

        

         词序相似度计算法方法如下:

                 

    其中r1、r2 分别为T1、T2的词序向量,以T1为例,其计算方法如下:

    1、对于T中的每一个词wi,如果T1中包含该次,则r1中该次的取值为该词在T1中出现的词序。否则在T1中找出与wi最相似的词Wi。

    2、如果wi 和 wi 的相似度大于一个给定的阈值(实验取值为0.4),wi在r1中的取值设为wi在Ti中出现的词序。

    3、如果两种情况均为发生,则wi在r1中的取值设为null。 

    然而,根据语义向量计算语义相似度方法中,想到了之前看过的一篇博客,通过 余玄定理来实现,计算方法如下

//阈值
public static double YUZHI = 0.2 ;

/**
 * 返回百分比
 * @author: Administrator
 * @Date: 2015年1月22日
 * @param T1
 * @param T2
 * @return
 */
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("传入参数有问题!");
    }
}

测试结果

str分词后:[这个, 中文分词, 可不可以, 用着, 方, 不, 方便]
str分词后:[这个, 中文分词, 比较方便, 用着, 方便, 还可以]
相似度:0.7595872466989299


代码地址: twosnail源码地址

原创作者: twosnail(两只蜗牛)


相关 [ikanalyzer 中文分词 计算] 推荐:

IKAnalyzer中文分词,计算句子相似度

- - 两只蜗牛 - 关注生活,关注旅游
IKAnalyzer中文分词,计算句子相似度.     IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包. 以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件. 独立于Lucene项目,同时提供了对Lucene的默认优化实现. (简介来源: 百度百科).

全文检索引擎Solr系列——整合中文分词组件IKAnalyzer

- - ImportNew
IK Analyzer是一款结合了词典和文法分析算法的中文分词组件,基于字符串匹配,支持用户词典扩展定义,支持细粒度和智能切分,比如:. 张三 | 说的 | 确实 | 在理. 张三 | 三 | 说的 | 的确 | 的 | 确实 | 实在 | 在理. 整合IK Analyzer比mmseg4j要简单很多, 下载解压缩IKAnalyzer2012FF_u1.jar放到目录:E:\solr-4.8.0\example\solr-webapp\webapp\WEB-INF\lib,修改配置文件schema.xml,添加代码:.

IKAnalyzer和Ansj切词Demo

- - ITeye博客
        IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包. String content = "Java编程思想(第4版)";.         Ansj中文分词这是一个ictclas的java实现.基本上重写了所有的数据结构和算法.词典是用的开源版的ictclas所提供的.切词Demo代码如下:.

Jcseg java中文分词器

- - 企业架构 - ITeye博客
Jcseg[dʒɛ'​ke'sɛ]完整版本(源码, 词库, 帮助文档, 词库管理工具, jar文件)下载:  http://sourceforge.net/projects/jcseg . jcseg是使用Java开发的一个开源中文分词器,使用流行的mmseg算法实现,并且提供了最高版本的lucene, solr, elasticsearch(New)的分词接口..

细说中文分词

- - 标点符
完整的中文自然语言处理过程一般包括以下五种中文处理核心技术:分词、词性标注、命名实体识别、依存句法分析、语义分析. 其中,分词是中文自然语言处理的基础, 搜素引擎、文本挖掘、机器翻译、关键词提取、 自动摘要生成等等技术都会用到中文分词,包括最近在学习的 聊天机器人、 文本相似性等. 可以说分词是自然语言大厦的地基,下面就让我们从它开始谈起.

漫话中文分词算法

- dumin - Matrix67: My Blog
    记得第一次了解中文分词算法是在 Google 黑板报 上看到的,当初看到那个算法时我彻底被震撼住了,想不到一个看似不可能完成的任务竟然有如此神奇巧妙的算法. 最近在詹卫东老师的《中文信息处理导论》课上再次学到中文分词算法,才知道这并不是中文分词算法研究的全部,前前后后还有很多故事可讲. 在没有建立统计语言模型时,人们还在语言学的角度对自动分词进行研究,期间诞生了很多有意思的理论.

中文分词算法代码大全

- - 鲁塔弗的博客
做中文搜索,关键词提取,文档分类都离不开中文分词,能用的代码包有如下. 单字切分 sphinx只要把min_word_len设置为1,并配置charset_table,默认就是单字切分,lucene用StandardAnalyzer. CJKAnalyzer lucene自带,两两分词,就是把 ABCD 分成 AB,BC,CD 3段.

再说中文分词技术

- - 标点符
众所周知,英文是以词为单位的,词和词之间是靠空格隔开,而中文是以字为单位,句子中所有的字连起来才能描述一个意思. 例如,英文句子I am a student,用中文则为:“我是一个学生”. 计算机可以很简单通过空格知道student是一个单词,但是不能很容易明白“学”、“生”两个字合起来才表示一个词.

ElasticSearch中文分词ik安装

- - ITeye博客
下载编译好的安装包,解压缩就可以直接使用. 自己编译的版本在安装插件时可能会出现一些问题. 上面这一步很简单,没有出现任何问题就通过了,然而在安装ik时走了很多弯路,为防止今后出现类似情况将此次安装过程中出现的问题记录下来. 从elasticsearch-rtf中下载的elasticsearch-analysis-ik-1.2.6.jar直接拷贝到.

java中文分词组件-word分词

- - 研发管理 - ITeye博客
关键字:java中文分词组件-word分词. word分词器主页 :https://github.com/ysc/word. word分词是一个Java实现的中文分词组件,提供了多种基于词典的分词算法,并利用ngram模型来消除歧义. 能准确识别英文、数字,以及日期、时间等数量词,能识别人名、地名、组织机构名等未登录词.