您的位置 首页 java

文本和关键词相似度计算(切词、余弦相似度)JAVA实现

文本和关键词相似度计算(切词、余弦相似度)JAVA实现

问题描述:

文本分类计算:假设文章类别分为多个类别,每个类别都有自己的关键词信息。

如何给新的文本归类?

如何修正每个类别的文章信息?

解决思路:

1、文本切词(IKAnalyzer开源):

借助于开源切词工具对文本做切词( 注:如果项目用到了ES,需要排包,否则,有lucene的jar包冲突 )。

 <dependency>  
   <groupId>com.janeluo</groupId>  
      <artifactId>ikanalyzer</artifactId>  
      <version>${ikanalyzer.version}</version>  
      <exclusions>  
          <exclusion>  
              <groupId>org.apache.lucene</groupId>  
              <artifactId>lucene-analyzers-common</artifactId>  
          </exclusion>  
          <exclusion>  
              <groupId>org.apache.lucene</groupId>  
              <artifactId>lucene-core</artifactId>  
          </exclusion>  
          <exclusion>  
              <groupId>org.apache.lucene</groupId>  
              <artifactId>lucene-queries</artifactId>  
          </exclusion>  
      </exclusions>  
  </dependency>  

2、相似度计算( 余弦相似度 计算方法):

余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角余弦值来评估他们的相似度(具体原理百度一下,此处不再详述)。

实现代码:

 package com.spider.search.service.util;  
 import  JAVA .util.HashMap;  
 import java.util.Iterator;  
 import java.util.Map;  
 import java.util. Vector ;  
 public class SimilarUtils {  
     //阈值  
     public static  double  YUZHI = 0.001 ;  
     //返回百分比  
     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("相似度计算工具类传入参数有问题!");  
         }  
     }  
 }  

反向修正分类关键词信息:

通过对现有的类别所对应的文章库信息做切词操作,并统计topN,参照修正类别关键词库。

提到反向修正的大家不难想到BP神经网络、AI、梯度下降算法,这些都是一些很好的计算思路和方向。

JAVA实现代码地址:

文章来源:智云一二三科技

文章标题:文本和关键词相似度计算(切词、余弦相似度)JAVA实现

文章地址:https://www.zhihuclub.com/175306.shtml

关于作者: 智云科技

热门文章

网站地图