OntoThesaurus-API:面向应用系统的Web Service术语服务
1.
简介
为了让中文叙词表本体共建共享系统OTCSS进一步提供面向机器(应用程序)的术语服务,我们开发了一系列的Web Service API(OntoThesaurus-API)。现提供实验性开放服务,以测试系统功能和获取更多的需求信息,目前仅面向教育和科研目的。
图书馆信息管理系统、数据库检索系统、搜索引擎、标签系统等,无论基于什么平台开发、采用何种开发语言,都可以使用OntoThesaurus-API提供的服务,来实现基于中文叙词表本体的智能检索、知识链接和知识服务,具体应用如下:
l
利用OntoThesaurus-API,可以在OPAC中实现规范化检索,分类号、英译名扩展检索,上位词、下位词、相关词(或它们的子关系词)的扩展检索等,为读者提供更准确、更强大的检索服务。
l
在
l
此外,OntoThesaurus-API还可以应用在其他领域。如在数据库检索系统中,在主题词、关键词的检索功能上,可以使用它来辅助完成规范化检索、上下位扩展检索等功能;在搜索引擎中,可以利用此服务获取更多的检索词形态;在众多支持Tag的应用程序中,可以使用OntoThesaurus-API为用户输入的标签进行规范化的提示,使用户输入的标签更为规范化;在面向主题词的数据挖掘中,可运用OntoThesaurus-API基于主题词及其款目信息对数据进行挖掘、统计;在机器学习中,通过OntoThesaurus-API,可以提供同义词辨析机制和主题词分析机制,进行与主题词相关的信息抽取等等。
上述所有的应用都可以通过Web Service调用的标准方法,在不同的应用平台上进行实现。
相关论文已经在《图书情报工作》2010年54卷第2期上发表,题目为《OntoThesaurus Web
Service API及其应用研究》 。
http://www.lib.szu.edu.cn/nkosapp/ThesaurusProjectForCCTWL/services/ThesaurusService?wsdl
OntoThesaurus-API的应用示例:深圳大学图书馆主题词智能检索(http://opac.lib.szu.edu.cn/opac/otcss/search_zn.aspx
) 。
2.
OntoThesaurus-API
OTCSS共有以下7类共16个通用的Web Service API (另有若干个API用于特定的叙词表,并可以根据新的需求进行扩展):
l 获取叙词
① public Concept[] getConcepts (String key_word,int matching_mode,int search_field);
接口作用:
该接口的作用是通过各种检索关键字检索并获取叙词。
参数说明:
参数key_word为检索关键字(检索值);
参数matching_mode为匹配方式 (0:精确匹配 1:前方一致 2:任意一致 其中任意一致检索只能用于叙词(入口词)项以及英译名项);
参数search_field表示检索项 (0:叙词(入口词) 1:自定义分类号 2:中图分类号 3:英译名)。
返回结果说明:
如果查找结果为空则返回null,否则返回Concept(系统中定义的类,其属性有叙词名、叙词类型)数组。
l 获取叙词的数据类型属性(DatatypeProperty)
② public String getConceptAndCLCCode (String
concept,String separator);
接口作用:
通过指定的叙词获取相应的叙词及其中图法分类号。
参数说明:
参数concept为指定的叙词;
参数separator为指定的分隔符号。
返回结果说明:
该接口返回的结果是以separator作为分隔的叙词及其中图法分类号字符串。
③ public String getConceptAndEngCounterpart
(String concept,String separator);
接口作用:
通过指定的叙词获取相应叙词及其英译名。
参数说明:
参数concept为指定的叙词;
参数separator为指定的分隔符号。
返回结果说明:
该接口返回的结果是以separator作为分隔的叙词及其英译名字符串。
④ public String getEngCounterpartForConcept(String
concept,String separator);
接口作用:
通过指定的叙词获取相应叙词的英译名。
参数说明:
参数concept为指定的叙词;
参数separator为指定的分隔符号。
返回结果说明:
该接口返回的结果是指定叙词的以separator作为分隔的所有英译名字符串。
l 获取叙词的等同关系词(入口词)
⑤ public String getConceptAndNTerm (String concept,String separator);
接口作用:
通过指定的叙词获取相应叙词及其入口词(同义词)。
参数说明:
参数concept为指定的叙词;
参数separator为指定的分隔符号。
返回结果说明:
该接口返回的结果是以separator作为分隔的叙词及其入口词字符串。
⑥ public String getNTermForConcept(String concept,String separator);
接口作用:
通过指定的叙词获取相应叙词的入口词。
参数说明:
参数concept为指定的叙词;
参数separator为指定的分隔符号。
返回结果说明:
该接口返回的结果是指定叙词的以separator作为分隔的所有入口词字符串。
l 获取叙词的等级关系词(以及等级关系的子关系词)
⑦ public String getConceptAndBroader (String
concept,String separator);
接口作用:
通过指定的叙词获取相应叙词及其直接上位词。
参数说明:
参数concept为指定的叙词;
参数separator为指定的分隔符号。
返回结果说明:
该接口返回的结果是以separator作为分隔的叙词及其直接上位词字符串。
⑧ public String getBroaderByLevel(String concept,String separator,int level);
接口作用:
通过指定的叙词和指定的级数获取相应叙词的指定级数以内的所有上位词。
参数说明:
参数concept为指定的叙词;
参数separator为分隔符号;
参数level为所获取上位词的级数 ,从1开始(直接上位词级数为1)。
返回结果说明:
该接口返回的结果是指定叙词的指定级数以内的所有上位词,并以separator作为分隔的字符串。
⑨
public String getBroaderByPath(String concept,String
separator, String subproperty, int
level);
接口作用:
通过指定的叙词和指定的上位词子关系、级数获取相应叙词的指定级数以内的指定子关系上位词。
参数说明:
参数concept为指定的叙词;
参数separator为分隔符号;
参数subproperty为指定需要获取的上位词子关系属性(类属/实例/整体_部分);
level为获取子关系上位词的级数 ,从1开始(直接子关系上位词级数为1)。
返回结果说明:
该接口返回的结果是指定叙词、指定级数以内的所有指定子关系上位词,并以separator作为分隔的字符串。
⑩
public String getConceptAndNarrower(String concept,String
separator);
接口作用:
通过指定的叙词获取相应叙词及其直接下位词。
参数说明:
参数concept为指定的叙词;
参数separator为指定的分隔符号。
返回结果说明:
该接口返回的结果是以separator作为分隔的叙词及其直接下位词字符串。
⑪ public String getNarrowerByLevel(String concept,String separator,int level);
接口作用:
通过指定的叙词和指定的级数获取相应叙词的指定级数以内的所有下位词。
参数说明:
参数concept为指定的叙词;
参数separator为分隔符号;
参数level为所获取下位词的级数 ,从1开始(直接下位词级数为1)。
返回结果说明:
该接口返回的结果是指定叙词的指定级数以内的所有下位词,并以separator作为分隔的字符串。
⑫
public String getNarrowerByPath(String concept,String
separator, String subproperty, int
level);
接口作用:
通过指定的叙词和指定的下位词子关系、级数获取相应叙词的指定级数以内的指定子关系下位词。
参数说明:
参数concept为指定的叙词;
参数separator为分隔符号;
参数subproperty为指定需要获取的下位词子关系属性(类属/实例/整体_部分);
level为获取子关系下位词的级数 ,从1开始(直接子关系下位词级数为1)。
返回结果说明:
该接口返回的结果是指定叙词、指定级数以内的所有指定子关系下位词,并以separator作为分隔的字符串。
l 获取叙词的相关关系词(以及相关关系的子关系词)
⑬ public String getRelated(String concept,String separator);
接口作用:
通过指定的叙词获取相应叙词的相关词。
参数说明:
参数concept为指定的叙词;
参数separator为指定的分隔符号。
返回结果说明:
该接口返回的结果是指定叙词的以separator作为分隔的所有相关词字符串。
⑭ public String getRelatedByPath(String concept,String separator,string subproperty);
接口作用:
通过指定的叙词和指定的相关关系子关系获取相应叙词的指定子关系相关词。
参数说明:
参数concept为指定的叙词;
参数separator为分隔符号;
参数subproperty为指定需要获取的相关关系的子关系。
返回结果说明:
该接口返回的结果是指定叙词的所有指定子关系相关词,并以separator作为分隔的字符串。
l 获取叙词的完整款目信息
⑮ public ConceptProperty[] getConceptProperties(String concept);
接口作用:
获取指定叙词的所有属性-属性值(即叙词款目信息)。
参数说明:
参数concept为指定的叙词。
返回结果说明:
该接口返回的结果是:如果叙词不存在或该叙词不存在任何属性-属性值,返回null,否则返回ConceptProperty(系统中定义的类,其属性有Concept数组、Property、String数组,其中Property表示叙词款目具体属性如中图法分类号、上位词;而该属性所对应的多个属性值则根据属性值类型为叙词(入口词)或字符串值分别写入Concept数组或String数组中)数组。
l 获取OntoThesaurus中支持的所有属性的信息
⑯ public Property[] getProperties();
接口作用:
获取OntoThesaurus中支持的所有属性名称及其comment、label等信息。
返回结果说明:
该接口返回的结果是OntoThesaurus中支持的所有属性名称及其comment、label等信息,Property为系统中定义的类,其属性有name、label、comment,分别用于表示属性名、属性标签、属性注释。
3.
OntoThesaurus-API的调用方法
3.1 使用.Net的调用方式
根据OTCSS提供的Web服务的WSDL地址,以及希望调用的API,组成Web服务调用的完整URL地址。
如CCT1_OTCSS提供的Web服务的WSDL地址为:
http://www.lib.szu.edu.cn/nkosapp/ThesaurusProjectForCCTWL/services/ThesaurusService?wsdl
如果希望调用Web Service,通过入口词或叙词进行精确检索并获得叙词,那么选择的API为getConcepts。
构成调用此API的完整URL地址为:
http://www.lib.szu.edu.cn/nkosapp/ThesaurusProjectForCCTWL/services/ThesaurusService/getConcepts?key_word={0}&matching_mode=0&search_field=0
其中{0}处填写检索词。
i. .NET平台中提供了System.Net.HttpWebRequest来模拟页面访问URL的方法,并通过System.Net.HttpWebResponse类取得响应的页面内容。
在OTCSS系统中,利用Axis2作为它的Web服务引擎,提供的Web服务对中文的处理默认是ISO8859-1编码模式。因此在使用上述URL地址前需要对检索词进行ISO8859-1转码。
byte[] tmp = Encoding.Default.GetBytes(value);
string tmpvalue = Encoding.GetEncoding("ISO8859-1").GetString(tmp);
把tmpvalue的值作为key_word的参数值,利用HttpWebRequest类进行访问。
HttpWebRequest reqforsearch = (HttpWebRequest)WebRequest.Create(url);
接着利用HttpWebResponse类获得页面响应。
HttpWebResponse resforsearch = (HttpWebResponse)reqforsearch.GetResponse();
ii.
判断页面的响应是否成功,接着利用.NET平台中提供的System.IO.Stream,System.IO.StreamReader来获取(2)中得到的页面响应的数据流。
Stream stream = resforsearch.GetResponseStream();
srforsearch = new StreamReader(stream, System.Text.Encoding.GetEncoding("utf-8"));
string s = srforsearch.ReadToEnd();
iii.
Web Service返回的结果是以XML格式进行展示的。所以接下来根据具体需求对这些XML返回结果做解析,这里主要采用正则表达式的方法去做解析。
string concept_regex = "<ax21:label>(.*?)</ax21:label>";
Match concept_match = Regex.Match(s, concept_regex);
if (concept_match.Success)
{
result = concept_match.Groups[1].Value;
}
这里解析出来的结果为例子中需要的正式主题词(叙词)。
i. 首先点“添加Web引用”,填写URL地址为:
http://www.lib.szu.edu.cn/nkosapp/ThesaurusProjectForCCTWL/services/ThesaurusService?wsdl
填写Web引用名(如WebReference);系统会自动根据这个WSDL文件生成相应的代理类;
ii. 接着在程序中通过这些代理类来调用Web Service接口,如
byte[] tmp = Encoding.Default.GetBytes(value);
string tmpvalue = Encoding.GetEncoding("ISO8859-1").GetString(tmp);
TestWSClient.WebReference.ThesaurusService ts = new TestWSClient.WebReference.ThesaurusService();
TestWSClient.WebReference.Concept[] result = ts.getConcepts(tmpvalue, 0, true, 0, true);
在使用这种方法时,同样需要先对传入的中文参数进行转码。
3.2 使用JAVA的调用方式
在JAVA中,如果希望直接通过URL地址进行调用Web Service,可以使用Apache Jakarta Common下的子项目HttpClient(http://hc.apache.org/httpclient-3.x/)。
首先到HttpClient的官方网站(http://hc.apache.org/httpclient-3.x)下载它的binary
with dependencies包。解压缩后取出lib中的6个包apache-mime4j-0.6.jar,commons-codec-1.3.jar,commons-logging-
接下来可以参考以下所描述的步骤进行操作:
i. 根据OTCSS提供Web服务的WSDL地址,以及希望调用的API,组成Web服务调用的完整URL地址。
例如CCT1_OTCSS提供的Web服务的WSDL地址为:
http://www.lib.szu.edu.cn/nkosapp/ThesaurusProjectForCCTWL/services/ThesaurusService?wsdl
如果希望调用Web Service,通过入口词或叙词进行精确检索并获得叙词,那么选择的API为getConcepts。
构成调用此API的完整URL地址为:
http://www.lib.szu.edu.cn/nkosapp/ThesaurusProjectForCCTWL/services/ThesaurusService/getConcepts?key_word={0}&matching_mode=0&search_field=0
其中{0}处填写检索词。
例如:
String keyword = "电脑";
String
tmpword = new String(keyword.getBytes("gbk"),"ISO8859-1");
String
urlstr =
"http://www.lib.szu.edu.cn/nkosapp/ThesaurusProjectForCCTWL/services/ThesaurusService/getConcepts?key_word="
+
tmpword +
"&matching_mode=0&search_field=0";
ii.
应用HttpClient提供的API,如这里使用Get的方式,通过创建DefaultHttpClient实例、HttpGet实例、ResponseHandler实例来访问上述的url,代码如下:
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(urlstr);
ResponseHandler<String> responseHandler = new BasicResponseHandler();
String responseBody
= null;
try {
responseBody = httpclient.execute(httpget, responseHandler);
} catch (ClientProtocolException e) {
//
TODO Auto-generated catch block
e.printStackTrace();
} catch
(IOException e) {
//
TODO Auto-generated catch block
e.printStackTrace();
}
其中responseBody就是Web Service调用后的结果(XML格式,所以您需要用正则表达式来获取您真正需要的内容)。
最后需要关闭DefaultHttpClient实例。如:
httpclient.getConnectionManager().shutdown();
也可以使用其他的Web Service工具包进行调用,如:
Axis2 (http://ws.apache.org/axis2/ ) 或者
XFire (http://xfire.codehaus.org/
)
具体的调用方式请查看他们的官方网站。
(林伟明,曾新红 文)