Skip to content

语义距离

Xusheng edited this page Feb 28, 2020 · 2 revisions

注意: 使用前需要下载word2vec模型,然后将解压出的模型文件存放到项目的 data/model/ 目录下。

词语相似度

float wordSimilarity(String word1, String word2)

通过计算词向量之间的余弦值来度量词语之间的相似度,返回一个 [-1,1] 之间的实数值。

参数

  • word1: 词语1
  • word2: 词语2
  • return: 词语相似度

示例

System.out.println("猫 | 狗 : " + AHANLP.wordSimilarity("猫", "狗"));
System.out.println("计算机 | 电脑 : " + AHANLP.wordSimilarity("计算机", "电脑"));
System.out.println("计算机 | 男人 : " + AHANLP.wordSimilarity("计算机", "男人"));
猫 | 狗 : 0.77247906
计算机 | 电脑 : 0.6953499
计算机 | 男人 : -0.030296274

获取相似词语

Set<WordEntry> getSimilarWords(String word, int maxReturnNum)

根据词语之间的语义相似度,返回与当前词语最相似的词语

参数

  • word: 词语
  • maxReturnNum: 最大返回词数
  • return: 相似词语集合

示例

Set<WordEntry> similarWords = AHANLP.getSimilarWords("微积分", 10);
for(WordEntry word : similarWords)
    System.out.println(word.name + " : " + word.score);
数学分析 : 0.8323148
微积分学 : 0.8201396
数学 : 0.7914304
复分析 : 0.7854058
线性代数 : 0.7812695
解析几何 : 0.77041334
概率论 : 0.7573191
数论 : 0.749195
拓扑学 : 0.7445861
定理 : 0.74404806

句子相似度

float sentenceSimilarity(String sentence1, String sentence2)

通过徐帅论文《面向问答系统的复述识别技术研究与实现》中的公式计算句子相似度

参数

  • sentence1: 句子1
  • sentence2: 句子2
  • return: 句子相似度

示例

String s1 = "苏州有多条公路正在施工,造成局部地区汽车行驶非常缓慢。";
String s2 = "苏州最近有多条公路在施工,导致部分地区交通拥堵,汽车难以通行。";
String s3 = "苏州是一座美丽的城市,四季分明,雨量充沛。";
System.out.println("s1 | s1 : " + AHANLP.sentenceSimilarity(s1, s1));
System.out.println("s1 | s2 : " + AHANLP.sentenceSimilarity(s1, s2));
System.out.println("s1 | s3 : " + AHANLP.sentenceSimilarity(s1, s3));
s1 | s1 : 1.0
s1 | s2 : 0.6629998
s1 | s3 : 0.37020335

默认使用标准分词器进行分词,也可以自定义分词器

float sentenceSimilarity(String segType, String sentence1, String sentence2)

参数

  • segType: 分词器类型,"Standard"或"NLP"
  • sentence1: 句子1
  • sentence2: 句子2
  • return: 句子相似度

示例

String s1 = "苏州有多条公路正在施工,造成局部地区汽车行驶非常缓慢。";
String s2 = "苏州最近有多条公路在施工,导致部分地区交通拥堵,汽车难以通行。";
String s3 = "苏州是一座美丽的城市,四季分明,雨量充沛。";
System.out.println("s1 | s1 : " + AHANLP.sentenceSimilarity("NLP", s1, s1));
System.out.println("s1 | s2 : " + AHANLP.sentenceSimilarity("NLP", s1, s2));
System.out.println("s1 | s3 : " + AHANLP.sentenceSimilarity("NLP", s1, s3));
s1 | s1 : 1.0
s1 | s2 : 0.7111925
s1 | s3 : 0.3496365

也支持直接传入分词后句子的词语列表

float sentenceSimilarity(List<String> sentence1Words, List<String> sentence2Words)

参数

  • sentence1Words: 句子1中的词语
  • sentence2Words: 句子2中的词语
  • return: 句子相似度

示例

String s1 = "苏州有多条公路正在施工,造成局部地区汽车行驶非常缓慢。";
String s2 = "苏州最近有多条公路在施工,导致部分地区交通拥堵,汽车难以通行。";
String s3 = "苏州是一座美丽的城市,四季分明,雨量充沛。";
List<String> sen1words = AHANLP.getWordList(AHANLP.NLPSegment(s1, true));
List<String> sen2words = AHANLP.getWordList(AHANLP.NLPSegment(s2, true));
List<String> sen3words = AHANLP.getWordList(AHANLP.NLPSegment(s3, true));
System.out.println("s1 | s1 : " + AHANLP.sentenceSimilarity(sen1words, sen1words));
System.out.println("s1 | s2 : " + AHANLP.sentenceSimilarity(sen1words, sen2words));
System.out.println("s1 | s3 : " + AHANLP.sentenceSimilarity(sen1words, sen3words));
s1 | s1 : 1.0
s1 | s2 : 0.7111925
s1 | s3 : 0.3496365
Clone this wiki locally