一. 题目如下:
依据实验3建立的索引文件,实现一个基于VSM模型的信息检索程序。

解释下,如何实现一个基于VSM模型的信息检索程序?

                //      段落序号,词条, tf-idf值   的二维空间表private final Table<Integer,String,Double> vectorTable = HashBasedTable.create();

没错,简单无脑的理解,就是给个检索的句子,从这一张二维空间表中找出最佳匹配的段落,这个检索算法模型叫VSM模型

二. 实现步骤
1. 构造数据结构
2. 实现算法
3. 没了,做个测试吧

三. 源代码
1.二维空间表数据结构(准确的讲,它已经实现了检索算法)

package experiment4;import java.util.HashSet;
import java.util.Map;
import java.util.Set;import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;public class VectorSpace {//      段落序号,    词条,    tf-idf值   的二维空间表private final Table<Integer,String,Double> vectorTable = HashBasedTable.create();protected VectorSpace(){}//VMS检索public int VSM(Map<String,Double> words){int index = 0;double max = 0;for(int rkey:vectorTable.rowKeySet()){Map<String,Double> map = vectorTable.row(rkey);double cos = cos(map,words);if(cos>max){max = cos;index = rkey;}}return index;}/*** 求两个句子的余弦相似度* @param map1* @param map2* @return*/public double cos(Map<String, Double> map1, Map<String, Double> map2) {Set<String> set = new HashSet<>();set.addAll(map1.keySet());set.addAll(map2.keySet());double fenzi = 0;double fenmu1 = 0;double fenmu2 = 0;for(String word:set){double x1 = map1.getOrDefault(word, 0.0);double x2 = map2.getOrDefault(word, 0.0);fenzi = fenzi + x1 * x2;fenmu1 = fenmu1 + x1 * x1;fenmu2 = fenmu2 + x2 * x2;}return fenzi/(Math.sqrt(fenmu1)+Math.sqrt(fenmu2));}//get setpublic Table<Integer, String, Double> getVectorTable() {return vectorTable;}}

2.简化下操作,写个VectorSpaces类

package experiment4;import java.util.HashMap;
import java.util.Map;import experiment1.Thesaurus;
import experiment2.HMM;
import experiment2.HMMFactory;
import experiment3.Term;
import experiment3.TermList;
import util.FileRW;/*** 严格来讲,它是一个综合实验1,2,3,4的词库类* 但是我的初衷只想把它设计为VectorSpace工具类*/
public final class VectorSpaces {//数据存储容器private static Map<String,WordStatistics> map = new HashMap<>();/*** 创建一个统计词库* @param path*/public static void create(String path){map.put(path, new WordStatistics(FileRW.read(path)));}/*** vsm检索语句* @param name* @param words* @return*/public static String VSM(String name,String words){WordStatistics ws = map.get(name);if(ws==null)return null;String []word = ws.thesaurus.spitWord(words);Map<String,Integer> map = new HashMap<>();for(String s:word){map.put(s, map.getOrDefault(s, 0)+1);}Map<String,Double> vsm = new HashMap<>();map.forEach((key,value)->{vsm.put(key, tf_idf(ws.termList,ws.thesaurus,key, value));});return ws.termList.indexOfDocument(ws.vec.VSM(vsm));}/*** 计算tf_idf* @param termList* @param thesaurus* @param word* @param times* @return*/private static double tf_idf(TermList termList, Thesaurus thesaurus, String word,int times){Term term = termList.getTerm(word);if(term==null)return 0;return Math.log((1+times)*Math.log(thesaurus.numOfSize()*1.0/(term.getNdoc()+1)));}/*** 词条统计综合库*/protected static class WordStatistics{public final VectorSpace vec;public final TermList termList;public final HMM hmm;public final Thesaurus thesaurus;public WordStatistics(String content){thesaurus = new Thesaurus(content);hmm = HMMFactory.createHMM(content);termList = new TermList(content);vec = new VectorSpace();for(Term term:termList.getList()){term.getMap().forEach((key,value)->{vec.getVectorTable().put(key, term.getWord(), tf_idf(termList, thesaurus, term.getWord(), value));});}}}
}

3.测试一下

package test;import experiment4.VectorSpaces;public class Test4 {public static void main(String[] args) {String path = "199801.txt";VectorSpaces.create(path);System.out.println(VectorSpaces.VSM(path, "美国政府对朝鲜实行打压政策"));System.out.println("=============================================================================");System.out.println(VectorSpaces.VSM(path, "在这一年中,中国的改革开放和现代化建设继续向前迈进。国民经济保持了“高增长、低通胀”的良好发展态势。"));System.out.println("==============================================================================");System.out.println(VectorSpaces.VSM(path, "中国收复台湾指日可待"));System.out.println("==============================================================================");System.out.println(VectorSpaces.VSM(path, "我曾经想画幅漫画位能把各种人造卫星送上太空的中国专家,低头拿出国产圆珠笔要在文件上签字,把纸划破了,字还是写不出来"));}}

程序源码,在第一篇开篇处

自然语言处理基于java实现(4) 之 基于VSM模型的信息检索程序相关推荐

  1. java毕业设计——基于Java+Socket的视频会议系统设计与实现(毕业论文+程序源码)——视频会议系统

    基于Java+Socket的视频会议系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于Java+Socket的视频会议系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下 ...

  2. 基于JAVA的类与对象做出的英雄打怪兽程序

    一.英雄打怪兽 基于Java类与对象的调用而做出的程序. 二.实例代码 1.主函数 代码如下: menu(); 2.menu函数 代码如下: Scanner scanner = new Scanner ...

  3. java毕业设计——基于Java+Javamail的邮件收发系统设计与实现(毕业论文+程序源码)——邮件收发系统

    基于Java+Javamail的邮件收发系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于Java+Javamail的邮件收发系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦 ...

  4. 【微信小程序】基于Java+uniapp框架开发的全开源微信小程序商城系统

    应用介绍 基于Java+uniapp框架开发的全开源微信小程序商城系统,前端采用目前主流的uniapp框架开发,后端采用Java语言开发,前后端代码全部开源,减少重复造轮子,支持小程序商城秒杀.优惠券 ...

  5. java毕业设计——基于java+EVENODD编码的基于纠错码的冗余技术设计与实现(毕业论文+程序源码)——基于纠错码的冗余技术

    基于java+EVENODD编码的基于纠错码的冗余技术设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+EVENODD编码的基于纠错码的冗余技术设计与实现,文章末尾附有本毕业设计的 ...

  6. 基于java的物流信息_基于Java EE的物流信息系统的开发设计

    开发案 例 现代计算机 2010.12 基于 Java EE 的物流信息系统的开发设计 廖作斌 (福建泉州师范学院数学与计算机科学学院, 泉州 362000) 关键词: Java EE: 信息系统: ...

  7. 基于java高校教师管理系统_基于Java EE高校教师继续教育管理系统的设计和实现...

    2016年第9期 科 技 广 场 总第178期 基于Java EE高校教师继续教育管理 系统的设计和实现 陈 强 (广东科技学院计算机系,广东 东莞 523083) 摘要:本文对广东科技学院继续教育管 ...

  8. 基于java订单管理系统_基于JAVA技术的订单管理系统(DOC毕业设计论文)

    基于JAVA技术的订单管理系统(DOC毕业设计论文) 摘要本 论 文 的 研 究 课 题 是 < 基 于 JSP 技 术 的 订 单 管 理 系 统 > 的 实 现 . 本 系 统 通过 ...

  9. 基于java家教管理系统_基于jsp的家教信息管理-JavaEE实现家教信息管理 - java项目源码...

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的家教信息管理, 该项目可用各类java课程设计大作业中, 家教信息管理的系统架构分为前后台两部分, 最终实现在线上 ...

最新文章

  1. springboot 简单自定义starter - beetl
  2. 关于UI交互设计方面一些考虑的问题
  3. securecrt鼠标右键的配置
  4. ashx 绝对路径得到物理路径
  5. 【常见笔试面试算法题12】动态规划算法案例分析
  6. the blocks problem(uva 101 or poj 1208)
  7. python云计算主要是干嘛的_国内python 云计算是干什么的
  8. onvif学习笔记4:Windows环境使用gsoap生成onvif框架代码
  9. html%3c arial%3e,【博客园】样式美化+网站统计访问+添加网易云背景音乐
  10. 「陶哲軒實分析」 習題 3.5.9
  11. python身份证号码共18位_涨姿势:用Python完成15位18位身份证的互转
  12. 《UnityAPI.Transform变换》(Yanlz+Unity+SteamVR+云技术+5G+AI+VR云游戏+Transform+eulerAngles+LookAt+立钻哥哥++OK++)
  13. ZCMU-1345: 国际象棋
  14. 专家解析:程序员到软件架构师培训与认证之路
  15. Axure中移动的绝对位置
  16. 登录页面(使用数据库)
  17. 从zotero文献集中批量导出PDF的方法
  18. Thinking in java生词
  19. 荣耀v10图片是html格式,荣耀V10真机上手图赏 参数配置分析详解
  20. 1008 : 美元和人民币

热门文章

  1. linux 添加启动项运行shell脚本的方法
  2. 相移法(PMP)中影响重建精度的几个因素
  3. 如何学习软件测试开发?从入门到精通?
  4. php爬虫——以爬取图片为例
  5. 基于PWM的三基色LED的调光调色
  6. Vue分页页码栏设计
  7. 有测试无损音乐真假的软件,这几招教你辨析真假无损音乐,非常实用!
  8. Machine Learning上机作业ex3解答
  9. 文献下载神器:文献党下载器使用方法
  10. 张孝祥并发编程学习笔记实践