在 java 应用程序中使用 java 字典和辞典 api
级别: 中级 |
软件工程师, ibm 软件试验室,bangalore
2004 年 10 月
java 字典和辞典 api(dictionary and thesaurus api for java,jadt)是 java 应用程序中访问语言特性的一个类库。本文是由两部分组成的系列文章的第 1 部分,在本文中,jadt 开发人员 rakesh midha 从用户的角度讨论了 jadt,并展示了如何在 java 应用程序里使用 jadt。他讨论了 jadt 中涉及的各种不同的类和设计,以及 jadt 中可以使用的一些特性。第 2 部分则深入讨论体系结构和 api 的细节,为那些希望实现 jadt 驱动程序的用户提供指导。
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 所示:
|
单词word 接口代表语言单元或者母语使用者能够识别的字符构成。 word 把单词的信息包装起来。保存在 word 里的信息包括单词拼写、类型、来源、发音和记录。一旦从某项服务得到了 word 对象,就可以方便地用它的方法来提取信息,如清单 2 所示:
|
字典记录 dictionaryrecord 对象保存单词的附加信息。 dictionaryrecord 通常被用来表示 jadt 驱动程序实现的某项服务获得的单词结果集。记录中保存着单词的信息,例如它的描述、类型、用法、区域、发音等等。因为 dictionaryrecord 是作为 chainedobject 实现的,所以能够以串接对象的形式,用 chainedobject 来取得多组单词信息。可以把这项技术用于某一服务的结果集,如清单 3 所示:
|
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 驱动程序都支持这项服务。可以用下面的语句,从驱动程序得到特定语言的字典:
|
getmeaning() 方法为您指定的每个单词提取 dictionaryrecord,里面包含单词的多个含义。清单 4 显示了字典的用法:
|
使用辞典wordbook 是提供相关单词分类列表的服务组件,它提供了所有相关单词的信息。这些单词可以按照用法、来源、发音等指标关联起来。
可以用以下代码从驱动程序访问这项服务:
|
文本和 xml 驱动程序都支持这项服务。
jadt 的当前版本提供了实现以下服务的接口:
同义词
同义词(synonyms)是指在给定上下文中可以互换使用的两个单词。有两个方法提供这项服务:
getsynonyms()用来取得同义词。issynonyms()用来判断两个单词是否同义词。
清单 5 显示了使用的方法:
清单 5. 检查同义词的辞典用法 |
本节里的其他服务也可以使用同样的技术,所以我就不为每项服务都演示了。
反义词
反义词(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 驱动程序都支持这项服务:
|
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 还提供了一个选项,可以查找符合某个规则的所有单词。
可以用以下语句从驱动程序访问这项服务:
|
目前,它支持用以下方式查找单词:
- 相似前缀:返回用相同前缀开始的单词:
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,您可以判断各个单词相互之间是不是变位词,或者找到指定单词的所有变位词。
可以用以下语句从驱动程序访问这项服务:
|
有两个方法提供这项服务:
anagrammise()用来取得变位词isanagram()用来判断两个单词是否变位词
这些方法可以像清单 6 所示的那样使用:
清单 6. anagrammizer 用法 |
使用语法检查器grammarchecker 检查单词在句子中的排列是否允许,检查单词在特定上下文中的用法是否正确。同样,这项服务可以用在出版和字处理应用程序中。
可以用以下语句从驱动程序访问这项服务:
|
使用 jadt 的grammarchecker,您可以:
- 用
check()方法判断是否使用了正确的语法 - 用
correct()方法纠正语法 - 用
suggestsimilar()方法对如何在具体上下文环境下纠正语法提出建议
使用翻译器translator被用来把单词或句子从一种语言转换成另一种语言。这个特性可以用在本地化和国际化实现中。利用这个特性,用一种语言编写的资源绑定文件可以被转换成另外一种语言。
可以用以下代码从驱动程序访问这项服务:
|
使用 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。
参考资料
- 您可以参阅本文在 developerworks 全球站点上的 英文原文。
- download the dictionary and thesaurus api for java from alphaworks.
- don't miss part 2 of this series (developerworks, september 2004), which looks at word references in detail.
- 从 alphaworks 下载 ibm xml4j 。
- 在 developerworks java 技术专区上可以找到更多 java 技术资源。
- 请访问developer bookstore,获得技术书籍的完整列表,其中包括数百本 java 相关主题的图书。
- 是否对无需通常的高成本入口点(entry point)或短期评估许可证的 ibm 测试产品感兴趣?developerworks 工具包订阅 为 websphere、db2、lotus、rational 和 tivoli 产品提供了低成本的 12 个月单用户许可证,包括基于 eclipse 的 websphere studio ide,用于开发、测试、评估和展示您的应用程序。
关于作者 rakesh midha 是 bangalore 的 ibm 软件试验室的软件工程师。他目前从事 ibm websphere 业务组件开发工作。他有 5 年在多平台和各种关系数据库系统(像 db2 udb、oracle、mysql 和 microsoft sql server)上进行 java 和 c++ 服务器端编程的经验。他的专长领域包括在银行、金融、编目行业以及订单和仓储管理系统等领域设计和开发独立的和 n 层分布式系统。他从 chandigarh 的 punjab 大学获得了电子工程学士学位,是 java 字典和辞典方面的技术专家,这项技术是由 ibm alphaworks 启动 |
rakesh midha 是 bangalore 的 ibm 软件试验室的软件工程师。他目前从事 ibm websphere 业务组件开发工作。他有 5 年在多平台和各种关系数据库系统(像 db2 udb、oracle、mysql 和 microsoft sql server)上进行 java 和 c++ 服务器端编程的经验。他的专长领域包括在银行、金融、编目行业以及订单和仓储管理系统等领域设计和开发独立的和 n 层分布式系统。他从 chandigarh 的 punjab 大学获得了电子工程学士学位,是 java 字典和辞典方面的技术专家,这项技术是由 ibm alphaworks 启动
闽公网安备 35060202000074号