LSI实验
来源:互联网 发布:2017网络实用技术基础 编辑:程序博客网 时间:2024/05/17 22:38
针对给定的文档集合,基于潜在语义索引原理(Latent Semantic Indexing, LSI),构建一个简单的搜索算法。
实验要求
- 针对给定的文档集合分词,计算每个词的TFIDF,构建文档向量
- 利用JAMA包,基于LSI原理,对Term-Document矩阵构造新的矩阵
- 基于以下关键词查询,基于LSI原理进行搜索,输出相对应的准确度
- 算法要求有相应的注释,输出包括:查询关键词,查询结果,根据LSI矩阵K的不同取值得到的查询准度:(K=10,20,30,40,50,100)
实验环境
操作系统:Windows 10
开发环境:JDK 1.7
Java库: ansj_seg-3.7.1-all-in-one.jar, Jama-1.0.3.jar
实验过程
对文档分词
使用ansj_seg1对文档进行分词。
输入:字符串
输出:一个带词性的单词列表
import org.ansj.domain.Term;import org.ansj.splitWord.analysis.ToAnalysis;// String docList<Term> termList = ToAnalysis.parse(doc);
计算TF-IDF
TF-IDF2即term frequency–inverse document frequency。
计算所有文档中所有单词与所有文档之间的TF-IDF值,构成term-by-document matrix。
// pseudo codetf(term, allTerms) = allTerms.count(term) / allTerms.size()idf(term, all) = 1 + log(allDocTerms.size() / allDocTerms.count(term))
其中allTerms
指某个文档中的所有term
,allDocTerms
指所有文档中的所有term
。
进行SVD
根据潜在语义索引(Latent Semantic Indexing,LSI)3原理,使用Jama4对上面得到的Term-Document矩阵进行奇异值分解(Singular Value Decomposition,SVD)5。
根据SVD公式:
K作为一个参数会影响结果,这里对K取不同的值进行实验。
import Jama.Matrix;import Jama.SingularValueDecomposition;Matrix A;// A = U S V^TSingularValueDecomposition svd = A.svd();// U: concept-by-term matrixU = svd.getU();// V: concept-by-document matrixV = svd.getV();// S: elements assign weights to conceptsS = svd.getS();Matrix Uk = U.getMatrix(0, U.getRowDimension() - 1, 0, K - 1);Matrix Sk = S.getMatrix(0, K - 1, 0, K - 1);Matrix VkT = V.getMatrix(0, V.getRowDimension() - 1, 0, K - 1).transpose();
进行LSI查询
根据LSI原理,对每个待查询关键词进行分词并构建小文档,并于每个词计算TF-IDF得到一个向量。
根据 https://en.wikipedia.org/wiki/Latent_semantic_indexing 知,
故可对上述得到的向量进行转换,并与1000个文档进行余弦相似性计算,得到相似性向量。
把相似性向量从大到小进行排序即为相应的搜索结果。也可以对每个查询词的相似性向量保存到csv中,可进行后续的分析。
// Q^T U S^{-1}Matrix Qk = Q.times(Uk.times(Sk.inverse()));for (int i = 0; i < VkT.getColumnDimension(); ++i) { Matrix doc = VkT.getMatrix(0, VkT.getRowDimension() - 1, i, i); double cosineSimilarity = Qk.times(doc).getArray()[0][0] / (Qk.norm2() * doc.norm2()); similarityList.add(cosineSimilarity);}
参考
- AnsjSeg 使用手册. http://nlpchina.github.io/ansj_seg/ ↩
- tf–idf. 维基百科. 最后修订于2016年3月8日. https://en.wikipedia.org/wiki/Tf%E2%80%93idf ↩
- Latent semantic indexing. 维基百科. 最后修订于2016年2月11日. https://en.wikipedia.org/wiki/Latent_semantic_indexing ↩
- JAMA : A Java Matrix Package. National Institute of Standards and Technology. 最后修订于2012年11月23日. http://math.nist.gov/javanumerics/jama/ ↩
- Singular value decomposition. 维基百科. 最后修订于2016年3月22日. https://en.wikipedia.org/wiki/Singular_value_decomposition ↩
- LSI实验
- LSI
- lsi
- Gensim-维基百科中文语料LDA,LSI实验记录
- 亲测实验,RTC使用内部低速时钟LSI时,对RTC的配置过程
- LSI测试(1)LSI测试部件
- Latent semantic Indexing(LSI)
- PLSI vs. LSI
- LSI收购Sandforce
- LSI PCIE企业应用
- 加载LSI驱动
- 潜在语义索引LSI
- 潜在语义索引(LSI)
- 隐性语义索引(LSI)
- LSI MegaRAID创建RAID10
- 隐含语义索引lsi
- 隐性语义索引LSI
- SVD and LSI Tutorial 1: Understanding SVD and LSI
- Dubbo之旅--注册中心
- C语言超大数除法,支持小数
- hdu 3478 Catch【并查集+二分图染色】
- QEMU-KVM中的多线程压缩迁移技术
- Mac本地搭建Apache服务器步骤,方便我们开发中网络测试
- LSI实验
- 动态规划—Problem A
- DirectX 学习经典参考书籍 电子书下载
- 一篇文章带你深入理解什么是负载测试
- 类模板
- zendStudio破解方法
- C#OOP之十一 委托和事件
- Hibernate中的Query一些基本用法
- 关于AlertDialog里面的EditText无法弹出软键盘的解决方法