package ruc.irm.similarity.word.hownet.concept;
import java.io.IOException;
import java.util.Collection;
import ruc.irm.similarity.util.BlankUtils;
import ruc.irm.similarity.word.hownet.sememe.LiuqunSememeParser;
import ruc.irm.similarity.word.hownet.sememe.SememeParser;
/**
* 刘群老师的相似度计算方式,对概念解析的处理方式
*
* @author <a href="mailto:iamxiatian@gmail.com">夏天</a>
* @organization 中国人民大学信息资源管理学院 知识工程实验室
* @deprecated
*/
public class LiuConceptParser extends ConceptParser{
private static LiuConceptParser instance = null;
public static LiuConceptParser getInstance(){
if(instance == null){
try {
instance = new LiuConceptParser();
} catch (IOException e) {
e.printStackTrace();
}
}
return instance;
}
private LiuConceptParser(SememeParser sememeParser) throws IOException {
super(sememeParser);
}
private LiuConceptParser() throws IOException{
super(new LiuqunSememeParser());
}
@Override
protected double calculate(double sim_v1, double sim_v2, double sim_v3, double sim_v4){
return beta1 * sim_v1
+ beta2 * sim_v1 * sim_v2
+ beta3 * sim_v1 * sim_v2 * sim_v3
+ beta4 * sim_v1 * sim_v2 * sim_v3 * sim_v4;
}
@Override
public double getSimilarity(String word1, String word2) {
double similarity = 0.0;
// 如果两个句子相同,则直接返回1.0
if (word1.equals(word2)) {
return 1.0;
}
Collection<Concept> concepts1 = getConcepts(word1);
Collection<Concept> concepts2 = getConcepts(word2);
//如果是blank,则说明是未登录词, 需要计算组合概念
if(BlankUtils.isBlank(concepts1) || BlankUtils.isBlank(concepts2)){
return 0.0;
}
//两个for循环分别计算词语所有可能的概念的相似度
for(Concept c1:concepts1){
for(Concept c2:concepts2){
double v = getSimilarity(c1, c2);
if(v>similarity){
similarity = v;
}
if(similarity == 1.0){
break;
}
}
}
return similarity;
}
}