求利用HanLP做文本相似度思路

课题组最近在项目中添加了一个类似于知网查重的功能。想在有新的文档存入数据库的时候将新入库数据与原数据库中的数据进行比较查重。本人没有从事过NLP开发,只是个普通java开发,学习了一段时间HanLP之后的开发思路如下。恳请指点:

  1. 分词 使用HNLP分词 ,分词模型使用默认模型,语料为wiki中文2019年语料,预处理后得到的1.23G文本(未删除英文和标点符号)。并且输出结果关闭词性展示。得到word2verOut.txt。

HanLP.Config.ShowTermNature = false; //分词结果关闭展示词性

  1. 词向量训练 使用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。

  1. 计算各个库存文档的向量值存数据库备用
/**
 * 将一个文档转为向量
 *
 * @param content 文档
 * @return 向量
 */
public Vector query(String content)
  1. 当新文档导入数据库之后,新文档也调用query方法生成向量,与数据库中老文本的向量比较
/**
 * 夹角的余弦<br>
 * 认为this和other都是单位向量,所以方法内部没有除以两者的模。
 *
 * @param other
 * @return
 */
public float cosineForUnitVector(Vector other)
  1. 得到结果制定阈值,最后返回是否有文档存在重复率较高问题。

我的大概思路是这样,不知道这样做是不是可以,麻烦指点迷津。谢谢!

分词语句:

格雷迪迪安加拿司职进攻中场迪安加拿出生于刚果民主共和国
结果:

格雷迪 迪安/nr 加拿 司职/v 进攻/v 中场 迪安加/d 拿出/v 生于/v 刚果民主共和国

像这种出现音译名字被错误分开的开启了,人名识别。这种是不是需要开启字典?

    NLPTokenizer.ANALYZER.enableNameRecognize(true); // 开启人名识别
    NLPTokenizer.ANALYZER.enableTranslatedNameRecognize(true); // 是否启用音译人名识别

  1. 在fallback任何规则系统前都应该试试在线学习。
  2. 不要期待98年语料训练出的NER在新媒体新领域上的表现。
1 Like

方便加个微信吗?
V:chen21024141

请问有新的思路吗

没有,最近在忙其他事情。你这块有新思路吗?可以菜鸡互相交流一下