问题描述:
文本分类计算:假设文章类别分为多个类别,每个类别都有自己的关键词信息。
如何给新的文本归类?
如何修正每个类别的文章信息?
解决思路:
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("相似度计算工具类传入参数有问题!");
}
}
}