package ruc.irm.similarity.word.hownet.sememe; import java.io.IOException; /** * 刘群老师计算义原相似度的方法, 实现了SememeParser中定义的抽象方法 * * @author <a href="mailto:iamxiatian@gmail.com">夏天</a> * @organization 中国人民大学信息资源管理学院 知识工程实验室 * * @author <a href="xiat@ruc.edu.cn">xiatian</a> * @version 1.0 * @deprecated */ public class LiuqunSememeParser extends SememeParser { /** 计算义元相似度的可调节的参数,默认为1.6 */ private final float alpha = 1.6f; public LiuqunSememeParser() throws IOException { super(); } /** * 计算两个义元之间的相似度,由于义元可能相同,计算结果为其中相似度最大者 * <br/>similarity = alpha/(distance+alpha) * * @param key1 * @param key2 * @return */ @Override public double getSimilarity(String item1, String item2) { int pos; // 如果为空串,直接返回0 if (item1 == null || item2 == null || item1.equals("") || item2.equals("")) return 0.0; String key1 = item1.trim(); String key2 = item2.trim(); // 去掉()符号 if ((key1.charAt(0) == '(') && (key1.charAt(key1.length() - 1) == ')')) { if (key2.charAt(0) == '(' && key2.charAt(key2.length() - 1) == ')') { key1 = key1.substring(1, key1.length() - 1); key2 = key2.substring(1, key2.length() - 1); } else { return 0.0; } } // 处理关系义元,即x=y的情况 if ((pos = key1.indexOf('=')) > 0) { int pos2 = key2.indexOf('='); // 如果是关系义元,则判断前面部分是否相同,如果相同,则转为计算后面部分的相似度,否则为0 if ((pos == pos2) && key1.substring(0, pos).equals(key2.substring(0, pos2))) { key1 = key1.substring(pos + 1); key2 = key2.substring(pos2 + 1); } else { return 0.0; } } // 处理符号义元,即前面有特殊符号的义元 String symbol1 = key1.substring(0, 1); String symbol2 = key2.substring(0, 1); for (int i = 0; i < Symbol_Descriptions.length; i++) { if (symbol1.equals(Symbol_Descriptions[i][0])) { if (symbol1.equals(symbol2)) { key1 = item1.substring(1); key2 = item2.substring(1); break; } else { return 0.0; // 如果不是同一关系符号,则相似度直接返回0 } } } if ((pos = key1.indexOf("|")) >= 0) { key1 = key1.substring(pos + 1); } if ((pos = key2.indexOf("|")) >= 0) { key2 = key2.substring(pos + 1); } int distance = getDistance(key1, key2); if (distance < 0) return 0.0; else return alpha / (distance + alpha); } @Override public double getSimilarity(Sememe sem1, Sememe sem2) { int distance = getDistance(sem1, sem2); if (distance <= 0) return 0.0f; else return alpha / (distance + alpha); } }