两个词之间的关系有同义、反义、近义(有多近?)、相关(有多相关?)等等。咱们如何来判断两个词之间的关系呢?利用计算机能自动找出这种关系吗?固然能够,不只能找出来,并且还能量化出有多近和有多相关。html
本文描述了superword开源项目中的定义类似规则,利用词的定义计算词和词之间的类似性。词的定义使用的是韦氏词典,同时也支持牛津词典。类似性算法使用的是word分词提供的10大类似性算法。java
定义类似规则主要包括如下6步:git
一、获取要计算的词的定义:github
String wordDefinition = MySQLUtils.getWordDefinition(word, WordLinker.Dictionary.WEBSTER.name());
二、获取分级词汇,分级词汇的具体定义见这里:web
Set<Word> words = (Set<Word>)application.getAttribute("words_"+request.getAttribute("words_type"));
三、获取分级词汇的定义,代码见这里:算法
List<String> allWordDefinition = MySQLUtils.getAllWordDefinition(WordLinker.Dictionary.WEBSTER.name(), words);
四、从word分词提供的10大类似性算法中任选一个,同时指定使用word分词提供的针对纯英文的分词器:app
TextSimilarity textSimilarity = new CosineTextSimilarity(); textSimilarity.setSegmentationAlgorithm(SegmentationAlgorithm.PureEnglish);
五、计算类似性,返回最类似的100个单词:webapp
int count = 100; Hits result = textSimilarity.rank(wordDefinition, allWordDefinition, count);
六、输出计算结果:jsp
StringBuilder temp = new StringBuilder(); int i=1; temp.append("<table border=\"1\">\n"); for(Hit hit : result.getHits()){ String[] attrs = hit.getText().split("_"); String w = attrs[0]; StringBuilder definition = new StringBuilder(attrs[1]); for(int j=2; j<attrs.length; j++){ definition.append(attrs[j]).append("_"); } temp.append("<tr>"); temp.append("<td> ").append(i++) .append(". </td><td> ") .append(WordLinker.toLink(w)) .append(" </td><td> ") .append(definition) .append(" </td><td> ") .append(hit.getScore()) .append("</td><td> ") .append("<a target=\"_blank\" href=\"definition-similar-rule.jsp?word=" + hit.getText() + "&count=" + count + "&words_type=" + request.getAttribute("words_type") + "\">类似</a>") .append(" </td>\n"); temp.append("</tr>\n"); } temp.append("</table>\n"); htmlFragment = temp.toString();
计算效果以下图所示:ui
一、使用韦氏词典的定义
二、使用爱词霸的定义
三、使用有道词典的定义