在 Java 應用程序中使用 Java 字典和辭典 API
Java 字典和辭典 API(JADT)是 alphaWorks 上發布的辭典特性的 API,是一個基於標准的類庫,用於在 Java 應用程序裡訪問語言特 性。它為 Java 程序員提供了透明的以 Java 為中心的方法,用以訪問字典和非結構化單詞,以及有關它們的信息。本文是由兩部分組成的 系列文章的第 1 部分,涉及的內容是用 JADT 開發增強字典和辭典的 Java 應用程序。第 2 部分提供了對體系結構和 API 的詳細考察。
JADT 概述
JADT 是用於從 Java 編程語言中訪問辭典數據的 API。它提供了可以在 Java 應用程序中使用的通用接口,獨立於字典/數據提供者的 實現。使用 JADT,用 Java 語言編寫的應用程序就可以訪問某個具體單詞的定義、發音、同義詞、反義詞等信息。
JADT 的特性包括:
訪問字典、辭典和其他服務的接口
多語言轉換接口
基於驅動程序的訪問協議
用於字典提供者和驅動程序開發人員的 API
訪問後端字典或辭典,比如數據庫、文件系統或基於 XML 的文件(只要實現了它們的驅動程序)
JADT 對於辭典數據訪問應用程序來說是一個非常有用的 API,因為它為執行這類任務提供了簡單的、標准的技術。它把應用程序開發人 員 從維護數據和數據訪問點的痛苦中解救出來。
對於很多使用多語言特性、本地化和類似特性的應用程序來說,這個 API 的實現會非常有用。例如,在編輯的時候,編輯可以用這個技 術進行拼寫檢查,或者得到更多合適單詞的建議。另一個示例應用可能是,讓需要翻譯的應用程序可以使用多語言字典和辭典。
除此之外,JADT 還提供了語言中立的接口,這讓它可以用於各種語言和方言。而且,由於 ADT 是用 Java 語言編寫的,它的示例驅動 程序也是用 Java 語言實現的,所以它是平台無關的。
JADT 數據結構
JADT 包括各種不同的組件和服務,取決於所使用的 JADT 的特性或具體的子集。您的 JADT 旅程的第一站,是一組提供數據組織的一般 方法的類和接口。因為所有服務都使用這些數據結構,所以 JADT 用戶對它們的了解,是非常重要的。
單詞列表
WordList 類就是一個單詞的容器。它不從後端資源取數據。WordList 一般用於傳遞、取得或包含成組的單詞。除此之外,還有一個選 項,用於查找符合特定規則的所有單詞。例如,它目前支持查找帶有相似前綴或後綴的單詞,支持共享某些子串的單詞查找。它與 WordLister 服務不同,因為它不從後台資源取詞,所以它僅僅是一個包裝類。它還可以用於單詞集合,如清單 1 所示:
清單 1. Wordlist 作為集合的用法
WordList wordlist= wordlister.findWithPrefix("un");
//Getting collection of words one by one
wordlist.start();
while(wordlist.hasMoreWords())
{
Word word=wordlist.getNext();
}
// Using WordList further to narrow down the search
// www.bianceng.cn
WordList wordlist2= wordlist.findWithSuffix("ing");
單詞
Word 接口代表語言單元或者母語使用者能夠識別的字符構成。Word 把單詞的信息包裝起來。保存在 Word 裡的信息包括單詞拼寫、類 型、來源、發音和記錄。一旦從某項服務得到了 word 對象,就可以方便地用它的方法來提取信息,如清單 2 所示:
清單 2. 用 word 提取數據
Word word=wordlist.getNext();
String strName=word.getWord();
字典記錄
DictionaryRecord 對象保存單詞的附加信息。DictionaryRecord 通常被用來表示 JADT 驅動程序實現的某項服務獲得的單詞結果集。 記錄中保存著單詞的信息,例如它的描述、類型、用法、區域、發音等等。因為 DictionaryRecord 是作為 chainedObject 實現的,所以 能夠以串接對象的形式,用 chainedObject 來取得多組單詞信息。可以把這項技術用於某一服務的結果集,如清單 3 所示:
清單 3. DictionaryRecord 的用法
DictionaryRecord dr= dict.getMeaning("dictionary");
dr.start();
while(dr!=null)
{
String strName=dr.getWordName();
String pronunciation=dr.getPronunciation();
String type= dr.getType();
String meaning=dr.getDescription();
dr=dr.getNextRecord();
}
JADT 驅動程序
就像我前面說過的,JADT 提供了基於驅動程序的訪問機制,所以 Java 應用程序可以獨立於實現提供者工作。為了做到這一點,JADT 驅動程序需要能夠與正在訪問的具體數據源進行通信。可以通過某個驅動程序服務,把用戶調用發布給數據源,還可以把這些語句的結果發 回用戶。
實現提供者負責 JADTDriver ,JADT 驅動程序則負責為您提取並提供您所需要的數據。
JADT 帶有兩個缺省驅動程序,用於與 JADT API 綁定的兩種不同數據源。這兩個驅動程序是 JADTTextDriver ,它針對以文本格式保存 的語言數據來實現, JADTXMLDriver ,它針對以 XML 格式保存的語言數據來實現。
控制流程
JADT API 定義了訪問 JADTDriver 服務的編程模型,Java 應用程序開發人員必須按照協議來使用 JADTDriver 。所以 JADT 服務訪問 代碼的最簡單流程必須是:
載入 JADTDriverFactory : 當調用 Class.forName("com.ibm.jadtdrivers.TextDriver.JADTTextDriverFactory"); 載入 JADTDriverFactory 的時候,JADTDriverFactory 會自動注冊到驅動程序上。
從 JADTDriverFactoryManager 獲得 JADTDriverFactory : JADTDriverFactory 是各種驅動程序的生產工廠,一直由 JADTDriverFactoryManager 控制。所以可以調用 JADTDriverFactory fac=JADTDriverFactoryManager.getJADTDriverFactory ("JADTTextDriverFactory"); ,用 JADTDriverFactoryManager 獲得 JADTDriverFactory 。
生成 JADT 驅動程序 : JADT 驅動程序 提供了對各種服務的訪問,例如字典、辭典、拼寫檢查、單詞表、翻譯器、語法檢查器和詞變 位器。可以調用工廠的 createJADTDriver() 方法來創建它:
Driver dri =fac.createJADTDriver();
設置驅動程序的屬性:驅動程序屬性由驅動程序提供者公布。例如,對於文本和 XML 驅動程序非常重要的是,用戶需要設置到達數據目 錄的路徑,可以用 driver.setProperty("JADTTextDriverDir","c:\\datadir"); 完成。如果沒有設置這個路徑,就會采用缺省值,缺省值 是驅動程序類的路徑。
現在,您就可以開始使用驅動程序支持的所有語言的驅動程序服務了。
訪問字典
字典是 JADT 驅動程序提供的最重要的服務之一,文本和 XML 驅動程序都支持這項服務。可以用下面的語句,從驅動程序得到特定語言 的字典:
Dictionary dict=driver.getDictionary("english","english");
getMeaning() 方法為您指定的每個單詞提取 DictionaryRecord ,裡面包含單詞的多個含義。清單 4 顯示了字典的用法:
清單 4. 字典的用法
DictionaryRecord dr= dict.getMeaning("dictionary");
dr.start();
while(dr!=null)
{
String strName=dr.getWordName();
String pronunciation=dr.getPronunciation();
String type= dr.getType();
String meaning=dr.getDescription();
dr=dr.getNextRecord();
}
使用辭典
WordBook 是提供相關單詞分類列表的服務組件,它提供了所有相關單詞的信息。這些單詞可以按照用法、來源、發音等指標關聯起來。
可以用以下代碼從驅動程序訪問這項服務:
WordBook wordbook=driver.getWordBook("english");
文本和 XML 驅動程序都支持這項服務。
JADT 的當前版本提供了實現以下服務的接口:
同義詞
同義詞(Synonyms)是指在給定上下文中可以互換使用的兩個單詞。有兩個方法提供這項服務:
getSynonyms() 用來取得同義詞。
isSynonyms() 用來判斷兩個單詞是否同義詞。
清單 5 顯示了使用的方法:
清單 5. 檢查同義詞的辭典用法
DictionaryRecord dr= this.wordbook.getSynonyms("dictionary");
while(dr!=null)
{
String strName=dr.getWordName();
dr=dr.getNextRecord();
}
if(wordbook.isSynonyms("dictionary","lexicon"))
{
/*..*/
}
本節裡的其他服務也可以使用同樣的技術,所以我就不為每項服務都演示了。
反義詞
反義詞(Antonyms )是指意義相反的兩個單詞。使用 WordBook ,您可以檢查單詞是否意義相反,也可以找到單詞的所有反 義詞。同樣,也有兩個方法提供這項服務:
getAntonyms() 用來取得反義詞。
isAntonyms() 用來判斷兩個單詞是不是意義相反。
上位詞
上位詞(Hypernyms )是指范圍大或一般性概念的單詞。“Computer”或“fruit”相對於更具體的術語(例如“Dell”或 “banana”)來說,就是上位詞。您可以用 WordBook 來獲得所有的上位詞,或者檢測單詞是否為上位詞。有兩個方法提供這項服務:
getHypernym() 用來取得上位詞
isHypernym() 用來判斷兩個單詞是否上位詞
下位詞
下位詞(Hyponyms)是指更加具體的單詞或概念的單詞。專有名詞就是下位詞的好例子。“North America”或“Mercedes” 是“continent”或“automobile”的下位詞。
您可以用 WordBook 來檢查單詞是不是下位詞,您可以也查找指定單詞的所有下位詞。有兩個方法提供這項服務:
getHyponym() 用來獲得下位詞
isHyponym() 用來判斷兩個單詞是否下位詞
整體名詞
整體名詞(Holonyms)表示整體,指定單詞是它的組成部分。例如“hat”是“brim”和“crown”的整體名詞。有兩個方法 提供這項服務:
getHolonym() 用來取得整體名詞
isHolonym() 用來判斷兩個單詞是否整體名詞
部分名詞
部分名詞(Meronyms)表示指定單詞的一部分。例如,“brim”和“crown”就是“hat”的部分名詞。有兩個方法提供這項 服務:
getMeronym() 用來取得部分名詞
ismeronym() 用來判斷兩個單詞是否部分名詞
使用拼寫檢查器
您可以用 SpellChecker 來捕獲拼寫錯誤的單詞。對於編輯器、IDE 和其他字處理應用程序來說,它是一個很有用的工具。
您可以從驅動程序得到服務實例來訪問 SpellChecker ,如下所示。文本和 XML 驅動程序都支持這項服務:
SpellChecker spellchecker=driver.getSpellChecker("english");
JADT 的 SpellChecker 提供了以下特性:
查找單詞是否正確:調用 SpellChecker 的 check() 方法,該方法用單詞為參數,返回布爾值:
System.out.println("Word dictionar is right Spelling "+spellchecker.check
(new TextWord("dictionar")));
查找單詞的正確形式:調用 SpellChecker 的 correct() 方法,該方法用單詞作為參數,返回 DictionaryRecord :
DictionaryRecord dr=spellchecker.correct(new TextWord("dictionar"));
if(dr!=null)
System.out.println("Correct spelling of dictionar is "+dr);
查找類似單詞:調用 SpellChecker 的 suggestSimilar() 方法,該方法用單詞作為參數,返回 DictionaryRecord :
DictionaryRecord dr=spellchecker. suggestSimilar(new TextWord("dictionar"));
System.out.println("Words similar to dictionar are : ");
dr.Start();
while(dr.hasMoreWords())
System.out.println(dr.getNext());
使用單詞表
WordLister 允許您從後端資源取得單詞。JADT 的 WordLister 還提供了一個選項,可以查找符合某個規則的所有單詞。
可以用以下語句從驅動程序訪問這項服務:
WordLister wordlister=driver.getWordlister("english");
目前,它支持用以下方式查找單詞:
相似前綴:返回用相同前綴開始的單詞:
WordList dr= wordlister.findWithPrefix("perf");
System.out.println("Words with prefix \"perf\" are : ");
if(dr==null)return;
dr.Start();
while(dr.hasMoreWords())
{
System.out.println(dr.getNext());
}
相似後綴:返回用相同單詞後綴結束的單詞:
WordList dr= wordlister.findWithSuffix("ces");
System.out.println("Words with suffix \"ces\" are : ");
if(dr==null)return;
dr.Start();
while(dr.hasMoreWords())
{
System.out.println(dr.getNext());
}
共享某些子串:返回包含相同單詞的單詞:
WordList dr= wordlister.findWithSubstring("tiona");
System.out.println("Words with substring \"ces\" are : ");
if(dr==null)return;
dr.Start();
while(dr.hasMoreWords())
{
System.out.println(dr.getNext());
}
使用詞變位器
變位詞是通過重新排列單詞或短語的字母而得到的單詞或短語。Anagrammizer 用來取得用相同字符組成的單詞,對於文字游戲類應用程 序來說會非常有用。使用 Anagrammizer ,您可以判斷各個單詞相互之間是不是變位詞,或者找到指定單詞的所有變位詞。
可以用以下語句從驅動程序訪問這項服務:
Anagrammizer anagram=driver.getAnagrammizer("english");
有兩個方法提供這項服務:
Anagrammise() 用來取得變位詞
isAnagram() 用來判斷兩個單詞是否變位詞
這些方法可以像清單 6 所示的那樣使用:
清單 6. Anagrammizer 用法
DictionaryRecord dr= this.wordbook.Anagrammise(new TextWord("clear"));
while(dr!=null)
{
String strName=dr.getWordName();
dr=dr.getNextRecord();
}
if(wordbook. isAnagram("clear","clare"))
{
/*..*/
}
使用語法檢查器
GrammarChecker 檢查單詞在句子中的排列是否允許,檢查單詞在特定上下文中的用法是否正確。同樣,這項服務可以用在出版和字處理 應用程序中。
可以用以下語句從驅動程序訪問這項服務:
GrammarChecker grammarchecker=yourdriver.getGrammarChecker("english");
使用 JADT 的 GrammarChecker ,您可以:
用 check() 方法判斷是否使用了正確的語法
用 correct() 方法糾正語法
用 suggestSimilar() 方法對如何在具體上下文環境下糾正語法提出建議
使用翻譯器
Translator 被用來把單詞或句子從一種語言轉換成另一種語言。這個特性可以用在本地化和國際化實現中。利用這個特性,用一種語言 編寫的資源綁定文件可以被轉換成另外一種語言。
可以用以下代碼從驅動程序訪問這項服務:
Translator translator=yourdriver.getTranslator("english","french");
使用 JADT 的 Translator ,您可以:
用 translate() 方法把單詞翻譯成第二種語言。
用 translateSentence() 方法把句子翻譯成第二種語言。
JADT 應用程序示例
JADT 還帶有一個示例應用程序,演示了 JADTTextDriver 和 JADTXMLDriver 驅動程序的特性。
要執行示例應用程序,請調用 java com.ibm.jadtsample.JADTSampleApplication 來打開應用程序,運行的效果如圖 1 所示:
圖 1. 示例應用程序屏幕
確保您是在資源文件部署的目錄中執行 java com.ibm.jadtsample.JADTSampleApplication 命令。
結束語
讀完這篇文章之後,對於 Java 字典和辭典 API 的工作方式,您應該從用戶的角度有了良好的認識。具體來說,您學習了基本的 JADT 結構,學習了如何利用不同的 JADT 服務和組件,用字典和其他與單詞有關的特性來建立 Java 應用程序。
在本系列文章的 第 2 部分中,我將從字典提供者的角度來考察 JADT,展示他們如何才能為字典和單詞數據實現 JADT。