兩個詞之間的關係有同義、反義、近義(有多近?)、相關(有多相關?)等等。咱們如何來判斷兩個詞之間的關係呢?利用計算機能自動找出這種關係嗎?固然能夠,不只能找出來,並且還能量化出有多近和有多相關。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
一、使用韋氏詞典的定義
二、使用愛詞霸的定義
三、使用有道詞典的定義