doc2vec用于训练文本向量-deeplearning4j实现

1.概述

        Tomas Mikolov不仅仅提出word2vec,还提出了fasttext、doc2vec、doc2vec  classify等经典  论文,下面用deeplearning4j实现doc2vec,并通过训练好的doc2vec计算文档相似度以及找最相似的文档,理论方面不多做介绍。

2.数据格式

  和前面提到用于训练word2vec的数据格式是一样的

 
   
  1. 想要 年轻漂亮 zi 手机 魔都 2 里面 排名 几位 专门 解绍 上海夜生活 \ ( o )
  2. 预定 h 其他数字 免费
  3. 40 10 名字 就是 微信
  4. 喜欢 经常 过来 人气 比较 玩具 特别 好多 品牌 玩具 都有 属于 综合 比较 有时候 看到 比较 喜欢 但是 比较 家里 空间 玩具 玩具 超人 回去 手机 上下 可以 上门 取送 玩具 特别 方便 appstore 里面 可以 搜索 下载
  5. 这家 中心 老师 负责 对待 孩子 耐心 家长 礼貌 可以 锻炼 孩子 社交能力 还有很多 免费体验 玩具 比如 滑行车 玩具 租赁 平台 玩具 ren 孩子 同款 干净 质量 很棒 体验 不错 赞一个
  6. 这家 中心 老师 负责 对待 孩子 耐心 家长 礼貌 可以 锻炼 孩子 大动作 发育 还有很多 免费体验 玩具 比如 秋千 玩具 租赁 平台 玩具 chao 孩子 同款 干净 质量 很棒 体验 不错 赞一个
  7. 梓涵 贪玩 有时候 天气 不好 平时 wan 超人 玩具 过来 小朋友们 一起玩 感觉 一下 长大 直接 应用 市场 appstore 搜索 玩具 超人 " 能找到
  8. 这家 中心 老师 负责 对待 孩子 耐心 家长 礼貌 可以 锻炼 孩子 大动作 发育 还有很多 免费体验 玩具 比如 摇摇 玩具 租赁 平台 ju 超人 孩子 同款 干净 质量 很棒 体验 不错 赞一个
  9. 玩具 租赁 平台 玩具 ren 孩子 同款 干净 质量 很棒 体验 不错 赞一个
  10. 这家 中心 老师 负责 对待 孩子 耐心 家长 礼貌 可以 锻炼 孩子 情绪 感受 能力 还有很多 免费体验 玩具 比如 海洋球 玩具 租赁 平台 玩具 chao 孩子 同款 干净 质量 很棒 体验 不错 赞一个
  11. 转让 一张 开通 100 代金券

3.代码
 
    
  1. package com.dianping.deeplearning.paragraphvectors;
  2. import java.io.FileNotFoundException;
  3. import java.util.Collection;
  4. import org.deeplearning4j.models.paragraphvectors.ParagraphVectors;
  5. import org.deeplearning4j.models.word2vec.VocabWord;
  6. import org.deeplearning4j.models.word2vec.wordstore.inmemory.AbstractCache;
  7. import org.deeplearning4j.text.documentiterator.LabelsSource;
  8. import org.deeplearning4j.text.sentenceiterator.BasicLineIterator;
  9. import org.deeplearning4j.text.sentenceiterator.SentenceIterator;
  10. import org.deeplearning4j.text.tokenization.tokenizer.preprocessor.CommonPreprocessor;
  11. import org.deeplearning4j.text.tokenization.tokenizerfactory.DefaultTokenizerFactory;
  12. import org.deeplearning4j.text.tokenization.tokenizerfactory.TokenizerFactory;
  13. import org.nd4j.linalg.api.ndarray.INDArray;
  14. import org.nd4j.linalg.ops.transforms.Transforms;
  15. public class Doc2VecAdd {
  16. private final static String ADXPATH_STRING="adx/wordvecsence.txt";
  17. public static void main(String[] args) throws FileNotFoundException {
  18. SentenceIterator iter=new BasicLineIterator(ADXPATH_STRING);
  19. AbstractCache<VocabWord> cache=new AbstractCache<>();
  20. TokenizerFactory t=new DefaultTokenizerFactory();
  21. t.setTokenPreProcessor(new CommonPreprocessor());
  22. LabelsSource source = new LabelsSource("DOC_");
  23. ParagraphVectors vectors=new ParagraphVectors.Builder().minWordFrequency(1).iterations(5)
  24. .epochs(1)
  25. .layerSize(100)
  26. .learningRate(0.025)
  27. .labelsSource(source)
  28. .windowSize(5)
  29. .iterate(iter)
  30. .trainWordVectors(false)
  31. .vocabCache(cache)
  32. .tokenizerFactory(t)
  33. .sampling(0)
  34. .build();
  35. vectors.fit();
  36. /*找到和下面句子最相近的词10的文档
  37. * 想要 年轻漂亮 妹 zi 手机 搜 魔都 2 字 印 伤 陈 里面 排名 前 几位 专门 解绍 上海夜生活 软 见 \ ( o )
  38. *
  39. * note:文档索引是从0开始的
  40. */
  41. System.out.println("找到和这篇文档最相似的文档:");
  42. System.out.print("想要 年轻漂亮 妹 zi 手机 搜 魔都 2 字 印 伤 陈 里面 排名 前 几位 专门 解绍 上海夜生活 软 见"+"\n");
  43. Collection<String> listCollection = vectors.wordsNearest("DOC_0", 10);
  44. for (String li : listCollection) {
  45. System.out.println(li);
  46. }
  47. System.out.println("获取文档的相似度以及向量");
  48. INDArray arr=vectors.lookupTable().vector("DOC_0");
  49. System.out.println("arr1 is :"+arr);
  50. INDArray arr1=vectors.inferVector("我的 手机 号码 是 手机号码");
  51. INDArray arr2=vectors.inferVector("我的 微信 号码 是 微信号");
  52. System.out.println("文档1和文档2的相似度是:"+Transforms.cosineSim(arr1, arr2));
  53. }
  54. }


4.结果

文档是以0开始做索引的
 
    
  1. 找到和这篇文档最相似的文档:
  2. 想要 年轻漂亮 zi 手机 魔都 2 里面 排名 几位 专门 解绍 上海夜生活
  3. DOC_192
  4. DOC_3709
  5. DOC_1044
  6. DOC_1668
  7. DOC_4014
  8. DOC_1372
  9. DOC_2186
  10. DOC_428
  11. DOC_24
  12. DOC_1249
  13. 获取文档的相似度以及向量
  14. arr1 is :[0.16, -0.01, 0.09, -0.05, 0.01, 0.12, 0.09, 0.03, 0.08, -0.16, -0.13, 0.12, -0.03, -0.03, -0.45, 0.01, 0.05, -0.03, -0.04, -0.03, 0.06, 0.03, -0.17, -0.04, -0.03, -0.05, -0.01, 0.21, -0.04, -0.05, 0.07, 0.07, -0.03, 0.06, -0.06, 0.04, 0.07, -0.15, 0.12, 0.02, 0.21, -0.09, 0.04, -0.12, -0.02, 0.01, 0.11, 0.07, 0.02, 0.12, 0.00, 0.05, 0.15, -0.06, -0.03, -0.02, 0.02, 0.21, 0.02, 0.07, -0.01, 0.10, -0.01, 0.09, 0.14, 0.04, 0.01, -0.03, 0.12, -0.09, 0.18, 0.06, -0.10, -0.05, 0.09, 0.09, 0.19, -0.02, -0.02, -0.14, -0.06, -0.10, 0.10, -0.05, 0.19, 0.19, -0.04, -0.04, -0.01, 0.07, 0.06, 0.05, -0.05, -0.07, 0.15, 0.09, -0.04, 0.01, 0.05, 0.01]
  15. 文档1和文档2的相似度是:0.610120952129364

先看下DOC_192



DOC_3709



总体来说还是比较准确的。

你可能感兴趣的:(机器学习,java)