package ruc.irm.similarity.word.cilin; /** * 表2-3 哈工大词林扩展版规则编码表<br/> * <table border="1" style="color:red;"> * <tr> * <td>编码位</td><td>1</td><td> 2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td> * </tr> * <tr> * <td>编码示例</td><td>C</td><td>b</td><td>0</td><td>7</td><td>A</td><td>0</td><td>3</td><td>=</td> * </tr><tr> * <td>类别级别</td><td>第一级</td><td>第二级</td><td colspan="2">第三级</td><td>第四级</td><td colspan="2">第五级</td><td>标记位</td><td> * </tr><tr> * <td>类别含义</td><td>大类</td><td>中类</td><td colspan="2">小类</td><td>词群</td><td colspan="2">原子词群</td><td>词语关系</td> * </tr> * </table> * <br/> * 表中编码位从左到右顺序排列,其中,第8位对应的标记位为“=”、“#”和“@”三种符号之一。其中“=”代表常见的“同义”关系,“#”代表词语之间的相关关系,“@”则代表词语自我封闭的独立性质,它在词典中既没有同义词,也没有相关词。 * * * @author <a href="mailto:iamxiatian@gmail.com">夏天</a> * @organization 中国人民大学信息资源管理学院 知识工程实验室 */ public class CilinCoding { public static double[] WEIGHT = new double[]{1.2, 1.2, 1.0, 1.0, 0.8, 0.4}; public static double TOTAL_WEIGHT = 5.6; public static String getCodeLevel(String code,int level){ switch(level){ case 1: return code.substring(0, 1); case 2: return code.substring(1, 2); case 3: return code.substring(2, 4); case 4: return code.substring(4, 5); case 5: return code.substring(5, 7); case 6: return code.substring(7); } return ""; } /** * 获取共同部分编码的权重 * @param code1 * @param code2 * @return */ public static double calculateCommonWeight(String code1, String code2){ double weight = 0.0; for(int i=1; i<=6; i++){ String c1 = getCodeLevel(code1,i); String c2 = getCodeLevel(code2,i); if(c1.equals(c2)){ weight += WEIGHT[i-1]; }else{ break; } } return weight; } public static String printCoding(String code){ StringBuilder sb = new StringBuilder(); for(int i=1; i<=6; i++){ if(i==1){ sb.append("[LEVEL_" + i); }else{ sb.append(", LEVEL_" + i); } sb.append(": "); sb.append(getCodeLevel(code, i)); } sb.append("]"); return sb.toString(); } }