课题组最近在项目中添加了一个类似于知网查重的功能。想在有新的文档存入数据库的时候将新入库数据与原数据库中的数据进行比较查重。本人没有从事过NLP开发,只是个普通java开发,学习了一段时间HanLP之后的开发思路如下。恳请指点:
- 分词 使用HNLP分词 ,分词模型使用默认模型,语料为wiki中文2019年语料,预处理后得到的1.23G文本(未删除英文和标点符号)。并且输出结果关闭词性展示。得到word2verOut.txt。
HanLP.Config.ShowTermNature = false; //分词结果关闭展示词性
- 词向量训练 使用word2vec 。使用分词结果 word2verOut.txt ,由Word2VecTrainer训练
String TRAIN_FILE_NAME="data/test/wikimodel/word2ver.txt"; //输入训练已分词文本路径 String MODEL_FILE_NAME="data/test/wikimodel/word2ver1.txt"; //输出word2ver训练完成文件路径 Word2VecTrainer trainerBuilder = new Word2VecTrainer(); trainerBuilder.train(TRAIN_FILE_NAME, MODEL_FILE_NAME);
得到语料hanlp-wiki-vec-zh.txt。
- 计算各个库存文档的向量值存数据库备用
/** * 将一个文档转为向量 * * @param content 文档 * @return 向量 */ public Vector query(String content)
- 当新文档导入数据库之后,新文档也调用query方法生成向量,与数据库中老文本的向量比较
/** * 夹角的余弦<br> * 认为this和other都是单位向量,所以方法内部没有除以两者的模。 * * @param other * @return */ public float cosineForUnitVector(Vector other)
- 得到结果制定阈值,最后返回是否有文档存在重复率较高问题。
我的大概思路是这样,不知道这样做是不是可以,麻烦指点迷津。谢谢!