/** * 获取概念的所有义原 * * @param concept * @param includeMainSememe 是否包含主义原 * @return */ private List<String> getAllSememes(Concept concept, boolean includeMainSememe) { List<String> results = new ArrayList<String>(); if (concept != null) { if (includeMainSememe) { results.add(concept.getMainSememe()); } for (String sememe : concept.getSecondSememes()) { results.add(sememe); } for (String sememe : concept.getSymbolSememes()) { results.add(sememe); } for (String sememe : concept.getRelationSememes()) { results.add(sememe); } } return results; }
/** * 计算两个概念的组合概念, 计算过程中根据参照概念修正组合结果, 实际应用中的两个概念 应具有一定的先后关系(体现汉语“重心后移”特点), 如对于娱乐场,first="娱乐" * second="场", 另外, 还需要修正第一个概念中的符号义原对于第二个概念主义原的实际关系,当参照概念起作用时, * 即大于指定的阈值,则需要判断是否把当前义原并入组合概念中,对于第一个概念,还需要同时修正符号关系, 符合关系与参照概念保持一致. * * @param head 第一个概念 * @param tail 第二个概念 * @param ref 参照概念 * @return */ public Concept autoCombineConcept(Concept head, Concept tail, Concept ref) { // 一个为null,一个非null,直接返回非null的克隆新概念 if (tail == null && head != null) { return new Concept(head.getWord(), head.getPos(), head.getDefine()); } else if (head == null && tail != null) { return new Concept(tail.getWord(), tail.getPos(), tail.getDefine()); } // 第二个概念不是实词,直接返回第一个概念 if (!tail.isSubstantive()) { return new Concept(head.getWord() + tail.getWord(), head.getPos(), head.getDefine()); } // 如果没有参照概念、或者参照概念为虚词,则直接相加,即参照概念不再起作用 if (ref == null || !ref.isSubstantive()) { String define = tail.getDefine(); // define存放新的定义结果 // 把第一个概念的定义合并到第二个上 List<String> sememeList = getAllSememes(head, true); for (String sememe : sememeList) { if (!define.contains(sememe)) { define = define + "," + sememe; } } return new Concept(head.getWord() + tail.getWord(), tail.getPos(), define); } // 正常处理:参照概念非空,并且是实词概念 String define = tail.getMainSememe(); // define存放新的定义结果 List<String> refSememes = getAllSememes(ref, false); List<String> headSememes = getAllSememes(head, true); List<String> tailSememes = getAllSememes(tail, false); // 如果参照概念与第二个概念的主义原的义原相似度大于阈值THETA, // 则限制组合概念定义中与第二个概念相关的义原部分为: 第二个概念的义原集合与参照概念义原集合的模糊交集 double main_similarity = sememeParser.getSimilarity(tail.getMainSememe(), ref.getMainSememe()); if (main_similarity >= PARAM_THETA) { // 求交集 for (String tail_sememe : tailSememes) { double max_similarity = 0.0; String max_ref_sememe = null; for (String ref_sememe : refSememes) { double value = sememeParser.getSimilarity(tail_sememe, ref_sememe); if (value > max_similarity) { max_similarity = value; max_ref_sememe = ref_sememe; } } // 如果tail_sememe与参照概念中的相似度最大的义原经theta约束后超过阈值XI,则加入生成的组合概念定义中 if (max_similarity * main_similarity >= PARAM_XI) { define = define + "," + tail_sememe; refSememes.remove(max_ref_sememe); } } // end for } else { define = tail.getDefine(); } // end if // 合并第一个概念的义原到组合概念定义中 for (String head_sememe : headSememes) { double max_similarity = 0.0; String max_ref_sememe = ""; for (String ref_sememe : refSememes) { double value = sememeParser.getSimilarity(getPureSememe(head_sememe), getPureSememe(ref_sememe)); if (value > max_similarity) { max_similarity = value; max_ref_sememe = ref_sememe; } } if (main_similarity * max_similarity >= PARAM_OMEGA) { // 调整符号关系, 用参照概念的符号关系替换原符号关系, 通过把参照概念的非符号部分替换成前面义原的非符号内容即可 String sememe = max_ref_sememe.replace(getPureSememe(max_ref_sememe), getPureSememe(head_sememe)); if (!define.contains(sememe)) { define = define + "," + sememe; } } else if (!define.contains(head_sememe)) { define = define + "," + head_sememe; } } // end for return new Concept(head.getWord() + tail.getWord(), tail.getPos(), define); }