-
Notifications
You must be signed in to change notification settings - Fork 90
语义距离
Xusheng edited this page Mar 3, 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