hanlp官网,HanLP 是由一系列模型与算法组成的工具包,目标是普及自然语言处理在生产环境中的应用。HanLP 具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。
HanLP 主要功能包括分词、词性标注、关键词提取、自动摘要、依存句法分析、命名实体识别、短语提取、拼音转换、简繁转换等等。
xml
<dependency>
    <groupId>com.hankcs</groupId>
    <artifactId>hanlp</artifactId>
    <version>portable-1.7.3</version>
</dependency>
java
class test {
     public static void main(String[] args) {
          System.out.println(getSimilarity("今天天气","今天天气很好"));
     }
     public static double getSimilarity(String sentence1, String sentence2) {
          System.out.println("Step1. 分词");
          List<String> sent1Words = getSplitWords(sentence1);
          System.out.println(sentence1 + "\n分词结果:" + sent1Words);
          List<String> sent2Words = getSplitWords(sentence2);
          System.out.println(sentence2 + "\n分词结果:" + sent2Words);
          System.out.println("Step2. 取并集");
          List<String> allWords = mergeList(sent1Words, sent2Words);
          System.out.println(allWords);
          int[] statistic1 = statistic(allWords, sent1Words);
          int[] statistic2 = statistic(allWords, sent2Words);
          // 向量A与向量B的点乘
          double dividend = 0;
          // 向量A所有维度值的平方相加
          double divisor1 = 0;
          // 向量B所有维度值的平方相加
          double divisor2 = 0;
          // 余弦相似度 算法
          for (int i = 0; i < statistic1.length; i++) {
               dividend += statistic1[i] * statistic2[i];
               divisor1 += Math.pow(statistic1[i], 2);
               divisor2 += Math.pow(statistic2[i], 2);
          }
          System.out.println("Step3. 计算词频向量");
          for(int i : statistic1) {
               System.out.print(i+",");
          }
          System.out.println();
          for(int i : statistic2) {
               System.out.print(i+",");
          }
          System.out.println();
          // 向量A与向量B的点乘 / (向量A所有维度值的平方相加后开方 * 向量B所有维度值的平方相加后开方)
          return Double.valueOf(String.valueOf(NumberUtil.round((dividend / (Math.sqrt(divisor1) * Math.sqrt(divisor2)))*100,2)));
     }
     // 3. 计算词频
     private static int[] statistic(List<String> allWords, List<String> sentWords) {
          int[] result = new int[allWords.size()];
          for (int i = 0; i < allWords.size(); i++) {
               // 返回指定集合中指定对象出现的次数
               result[i] = Collections.frequency(sentWords, allWords.get(i));
          }
          return result;
     }
     // 2. 取并集
     private static List<String> mergeList(List<String> list1, List<String> list2) {
          List<String> result = new ArrayList<>();
          result.addAll(list1);
          result.addAll(list2);
          return result.stream().distinct().collect(Collectors.toList());
     }
     // 1. 分词
     private static List<String> getSplitWords(String sentence) {
          // 标点符号会被单独分为一个Term,去除之
          return HanLP.segment(sentence).stream().map(a -> a.word).filter(s -> !"`~!@#$^&*()=|{}':;',\\[\\].<>/?~!@#¥……&*()——|{}【】‘;:”“'。,、? ".contains(s)).collect(Collectors.toList());
     }
}
本文作者:Weee
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!