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

简介: 问题描述: 文本分类计算:假设文章类别分为多个类别,每个类别都有自己的关键词信息。如何给新的文本归类?如何修正每个类别的文章信息? 解决思路: 1、文本切词(IKAnalyzer开源):借助于开源切词工具对文本做切词(注:如果项目用到了ES,需要排包,否则,有lucene的jar包冲突)。 <dependency> <groupId>com.janeluo

问题描述:

文本分类计算:假设文章类别分为多个类别,每个类别都有自己的关键词信息。
如何给新的文本归类?
如何修正每个类别的文章信息?

解决思路:

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("相似度计算工具类传入参数有问题!");
}
}
}

JAVA实现代码地址:


https://github.com/sijunx/mySpider/blob/feature_word_dic_20191001001/spider-scrawl/spider-scrawl/spider-scrawl-service-impl/src/main/java/com/spider/search/service/util/SimilarUtils.java

https://github.com/sijunx/mySpider/blob/feature_word_dic_20191001001/spider-scrawl/spider-scrawl/spider-scrawl-service-impl/src/main/java/com/spider/search/service/util/SpiderKeyWordExtractUtil.java

目录
相关文章
|
1月前
|
Java API Apache
Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
【10月更文挑战第29天】Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
141 5
|
1月前
|
存储 分布式计算 Java
存算分离与计算向数据移动:深度解析与Java实现
【11月更文挑战第10天】随着大数据时代的到来,数据量的激增给传统的数据处理架构带来了巨大的挑战。传统的“存算一体”架构,即计算资源与存储资源紧密耦合,在处理海量数据时逐渐显露出其局限性。为了应对这些挑战,存算分离(Disaggregated Storage and Compute Architecture)和计算向数据移动(Compute Moves to Data)两种架构应运而生,成为大数据处理领域的热门技术。
67 2
|
1月前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
2月前
|
机器学习/深度学习 算法 搜索推荐
让星星⭐月亮告诉你,Java冒泡排序及其时间复杂度计算
冒泡排序是一种简单的排序算法,通过多次遍历数组,每次比较相邻元素并交换位置,将较小的元素逐步移至数组前端。第一轮结束后,最小值会位于首位;第二轮则将次小值置于第二位,依此类推。经过 (n-1) 轮遍历后,数组完成排序。冒泡排序的时间复杂度为 O(n²),在最优情况下(已排序数组)时间复杂度为 O(n)。示例代码展示了如何实现冒泡排序。
65 1
|
2月前
|
分布式计算 资源调度 Hadoop
Hadoop-10-HDFS集群 Java实现MapReduce WordCount计算 Hadoop序列化 编写Mapper和Reducer和Driver 附带POM 详细代码 图文等内容
Hadoop-10-HDFS集群 Java实现MapReduce WordCount计算 Hadoop序列化 编写Mapper和Reducer和Driver 附带POM 详细代码 图文等内容
119 3
|
1月前
|
Java API Apache
java集合的组内平均值怎么计算
通过本文的介绍,我们了解了在Java中计算集合的组内平均值的几种方法。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。无论是使用传统的循环方法,还是利用Java 8的Stream API,亦或是使用第三方库(如Apache Commons Collections和Guava),都可以有效地计算集合的组内平均值。希望本文对您理解和实现Java中的集合平均值计算有所帮助。
40 0
|
2月前
|
消息中间件 Java Kafka
Flink-04 Flink Java 3分钟上手 FlinkKafkaConsumer消费Kafka数据 进行计算SingleOutputStreamOperatorDataStreamSource
Flink-04 Flink Java 3分钟上手 FlinkKafkaConsumer消费Kafka数据 进行计算SingleOutputStreamOperatorDataStreamSource
62 1
|
4月前
|
Rust JavaScript Java
简单对比Java、Python、Go、Rust等常见语言计算斐波拉契数的性能
简单对比Java、Python、Go、Rust等常见语言计算斐波拉契数的性能
|
5月前
|
搜索推荐 Java 大数据
Java中的数据流处理与流式计算实现
Java中的数据流处理与流式计算实现
|
5月前
|
并行计算 Java 大数据
Java中的高效并行计算与多线程编程技术
Java中的高效并行计算与多线程编程技术