前言
LSA(潜在语义分析)的详细概念我就不做介绍了。此处简单提一下,首先就是要构建单词-文档矩阵,然后关键的是进行SVD奇异值分解,这是核心的一步,最终通过计算向量夹角余弦值就可得到文档与文档之间的相似度。
这里有一位博主我觉得写得非常好,大家可以参考一下他的文章,他也附上了python的实现代码:
http://zhikaizhang.cn/2016/05/31/自然语言处理之LSA/
代码
因为项目需要,所以实现了一个java版本,加深记忆。下面是java版LSA代码。需要一个外部jar包,maven依赖如下:
<dependency>
<groupId>gov.nist.math</groupId>
<artifactId>jama</artifactId>
<version>1.0.3</version>
</dependency>
import Jama.Matrix;
import Jama.SingularValueDecomposition;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 2019年3月29日
*
* TODO Java版LSA
*
* @author jiebaHZ
*/
public class LSA {
private List<String> stopwords;
private List<String> docs;//注意这里输入的文档是分词之后的
private Matrix matrix;
private Map<String, List<Integer>> dictionary = new HashMap<String, List<Integer>>();
private List<String> keywords = new ArrayList<String>();
// 维数
private static int LSD = 2;
public LSA(List<String> docs) {
this.docs = docs;
}
public void lsa() {
// 读取停用词
stopwords = readStopwords();
// 过滤停用词