admin 管理员组文章数量: 887021
2023年12月22日发(作者:递归数列c)
电脑编程技巧与维护 ICTCLAS中文词法分析的Delphi调用研究 郭晓云 (南京政治学院上海分院信息管理系,上海200433) 摘要:深入研究了ICTCLAS2011的API,并利用Delphi实现了对其所有API的调用。 关键词:ICTCLAS;中文分词;Delphi Research and Implementation of ICTCLAS AP1 with Delphi GUO Xiaoyun (Shanghai Branch Nanjing Institute of Politics,Shanghai 200433) Abstract:This paper researches the ICTCLAS201 1 API and implement all API functions in Delphi Key words:ICTCLAS;Chinese Word Segmentation;Delphi ICTCLAS中科院计算所汉语词法分析系统是基于层次隐 注集映射文件等。 ICTCLAS2011的API由十几个API调用函数组成,大致 马尔科夫模型的中文词法分析系统。系统提供中文分词、词 性标注、命名实体识别、新词识别等功能,支持用户词典, 支持多种编码格式,是目前业界公认的最好的汉语词法分析 器,广泛应用于中文信息处理的各个领域【l_。 ICTCLAS提供了c++、c祥、Java 3种语言的接口文件和调 用文档,虽然官方文档宣称支持Delphi,但并没有提供Delphi 的接口文件和文档,导致Delphi程序员调用ICTCLAS时缺乏 必要的头文件和调用文档参考。为了解决这个问题,本文对 最新版的ICTCLAS2011(build 4004)的文档和程序进行了细 致的研究,利用Delphi对ICTCLAS接口进行了封装,并给出 了每个API函数的详细说明。 可分为初始化与卸载、文本文件处理、文本段落处理、字典 处理及辅助功能5类函数。应用程序首先需要调用 ICTCLAS_Init函数进行模型初始化,包括读取配置文件、加载 字典、建立内存对象等操作;然后再调用功能函数进行分词、 词性标注、字典管理、关键词抽取等处理;最后调用 ICTCLAS—Exit函数退出模型,释放占用的资源。 3 ICTCLAS的Delphi调用方法 Delphi静态调用DLL时,External声明的函数形式必须与 DLL的导出函数形式完全一致,否则在程序运行时会报XX函 数找不到的错误。由于ICTCLAS201 1在编译时并没有指定Def 文件,C++在编译时进行了多态处理,导致ICTCLAS2011的 1 DelDhi调用DLL的方法 ICTCLAS采用C++编码,在Windows中以DLL动态链接 库形式提供调用。对DLL,Delphi提供了两种调用方式:静态 调用和动态调用闭。 DLL导出函数并不是其附带的接口文档中的形式,而是形如 “?ICTCLASInit@@YA__NPBDH@Z”这样的形式。很多Delphi 程序员正是由于这个原因,而无法正常使用ICTCLAS2011。 解决这个问题需要使用可查看DLL导出函数的PE工具, 推荐使用Visual Studio提供的Dependency Walker嘲。Depends 静态调用将DLL的导出函数当做Delphi的普通函数处理, 使用Ex ̄rnal关键字直接声明和导入DLL函数。DLL的加载 和释放由系统处理。静态调用非常方便,但程序高度依赖 DLL文件,如果DLL出错,比如DLL文件路径不对、DLL声 明错误,程序将无法启动。 会显示出DLL导出函数的列表,包括函数的序号、函数名。 在声明函数时,可直接采用序号的方式声明函数,也可用工 具显示的函数名声明。 3.1 ICTCLAS常量和数据结构定义 动态调用在程序运行时使用Windows API函数 LoadLibrary动态加载DLL,使用GetProcAddress获取DLL函 ICTCLAS定义了一些常量和数据结构。常量包括标注集 代码、编码代码等,常量定义可参考ICTCLAS提供的c++头 文件。除了常量,还有一个很重要的数据结构Resuh_t,用于 存放分词及词性标注的结果,每个对象存放对一个词的处理 结果,此结构定义如下: resultt=record 数的指针地址,再通过指针调用函数。当不需要使用DLL时, 使用FreeLibrary动态释放DLL。动态调用灵活可控,可按程 序需要动态加载动态释放,即使DLL出错也不会导致系统无 法运行,但比静态调用要复杂。 对ICTCLAS,静态和动态两种调用方式都适用。篇幅所 限,主要介绍静态调用方法,动态调用仅给出一个小例子。 程序在Delphi2006和Delphi2010中都编译通过。 start:integer;//词语在输入句子中的开始位置 length:integer;,,词语的长度 iPOS:integer;,/{司性 2 ICTCLAS的组成及使用方法 ICTCLAS2011由主文件ICTCLAS2011.dll、配置文件 作者简介:郭晓云(1977一),男,讲师,研究方向:信息检 索、管理信息系统。 收稿日期:2011-10—19 configure.xml、许可证文件license.du及数据文件夹Data组成。 数据文件夹中存放模型文件、词典文件、词表文件、词性标 《 与
S0FrWARE DEVELOPMENT AND DESIGN sPos:array【0..POS—SIZE一1】of ansichar;//词性编号 word_ID:integer; 价司在字典中的编号,如果是未登录词,则为0 word_type:integer;价司是否在用户词典中;l,是用户词典 ,/中的词;0,非用户词典中的词 weight:integer; 司的权重,抽取关键词用 end; Presult_t= resultt;,/定义一个结构指针 3.2 ICTCLAS的初始化与卸载 初始化ICTCLAS使用ICTCLAS Init函数,卸载使用 ICTCLAS_Exit函数。 两个函数的静态调用方法如下: 首先在单元的声明部分声明如下函数,这里假定程序和 DLL文件在一个文件夹中。 function 1CTCLAS_lnit(const pszlnitDir:PAnsiChar=nil; encode:Integer=GBK_CODE):BOOL;cdecl;//pszlnitDir指定 玎始化的文件夹,encode指定文本编码类型 function ICTCLAS_Exit 0:BOOL;cdecl; 注意,由于ICTCLAS的头文件中函数声明为cdecl方式I41, 所以参数调用方式应选择edeel。c++中的字符串变量在Delphi 中应定义为Pansichar,而不是Pchar。因为在Delphi2010中, 为了处理Unicode,默认的Pchar已修改为4字节的Pwidechar。 然后在单元的Implementation部分增加函数与DLL的映 射。 function ICTCLAS_Init;external"ICTCLAS201 1.dll name ? ICTCLAS_Init@@YA_NPBDH@Z ; function ICTCLAS_Exit;external"ICTCLA¥201 1.dU name ? ICTCLAS Exit@@YA_NxZ,: 如果采用序号方式,以ICTCLAS Init为例,其实现方法 如下: function ICTCLAS Init;external 1CTCLAS2011.dll index 15; 两个函数的返回值都为BOOL类型,成功返回true,失败 返回false。 如果采用动态调用方法,以ICTCLAS_Init函数为例,其 过程如下: Tinit=function rconst pszlnitDir:PAnsiChar=nil;encode: Integer=GBK CODE):BOOL;cdecl;/庐明函数类型 Var Func:Tinit;,厂首先定义一个函数变量 Fhandle:=loadlibrary('ICTCLAS2011.d11 ); ,/然后动态加载DLL文件 if Fhandle>HINSTANCE_ERROR then,,如果加载成功 begin @func:=GetProcAddress(Fhandle,lpcs ̄(15)); ,/以序号方式获取函数指针 ,/@func:=GetProcAddress(Fhandle, ? ICTCLASInit@@YA_NPBDH@Z );∥以函数名形式 if Assigned(@func)then Func 0; ,/如果获得了函数指针,则通过指针调用此导出函数。 FreeLibrary(Fhandle):.//最后释放DLL文件。 end; 3.3 ICTCLAS处理文本文件 软件开发与设计 ICTCLAS处理文本文件使用ICTCLAS FileProcess和 ICTCLAS—FileProcessEx两个函数。前者默认进行词性标注, 后者则可由程序指定。 两个函数的声明如下: function ICTCLAS_FileProcess(const sSrcFilename: PAnsiChar;const sDsnFilename:PAnsiChar;const bPOStagged: integer=l、:double;cdecl; function ICTCLASFileProcessEx f const sSourceFilename: PAnsiChar;const sResultFilename:PAnsiChar):double;cdecl; 处理文本文件时直接调用此函数即可,其中参数 sSrcFilename指定要处理的文本文件名,sDsnFilename指定结 果文件名,bPOStagged指定是否词性标注,取1标注,0则不 标注。函数返回一个双精度实数错误码,如果成功则为 1000000。 3.4 ICTCLAS处理文本段落 ICTCLAS处理文本段落比直接处理文本文件复杂,需要 API函数与Result_t数据结构配合,函数包括 ICTCLAS_ParagraphProcess、ICTCLAS_ParagraphProcessA。其 中ICTCLAS_ParagraphProcess直接返回字符串形式的分词结 果,ICTCLAS—ParagraphProcessA则返回一组代表词的Result_t 数据结构。 两个函数的声明如下: function ICTCLAS ParagraphProcess(const sParagraph: PAnsiChar;const bPOSmgged:integer=11:PAnsiChar;cdecl; function ICTCLAS_ParagraphProcessA(const sParagraph: PAnsiChar;vat pResultCount:integer):Presult_t;cdecl; ,/返回Result__t指针,指针指向数量为pResultCount的Result_t ,/变,量,变量内存由ICTCLAS处理,不需要程序员去释放。 下面是调用ICTCLAS_PamgraphPr(】cessA的例子: count:=0;II先定义一个整数变量count rIe:=ICTCLAS_ParagraphProcessA(pansichar (paragraph),count);//对paragraph字符串变量进行处理, //Pre是一个Presult_t变量。函数运行后,将修改count变量为 //产生的result_t结构数量。 for I:=0 to count一1 d0//对Pre进行处理,结果存放在一 //+Tmemo控件中 begin memoresult.Lines.Add(inRos ̄(I re.start)); 价司语在输入句子中的开始位置 memoresult.Lines.Add(inaos ̄(Pre.1ength)); ,嗣语的长度,注意每个汉字的长度为2 memoresult.Lines.Add(inttostr(rIe.iPOS));/侗的词性 memoresult.Lines.Add(inuos ̄(Pre.word_ID)); ,侗在词典中的编号,0代表未登录词 memoresult.Lines.Add(inRos ̄(Pre.word_type)); ,/1代表用户词典中的词;0代表非用户词典中的词 memoresult.Lines.Add( …,】;//分隔符 Inc(Pre);,/指针递进,处理下一个词 end; 3.5 ICTCLAS的用户词典处理 词典的质量直接决定最后的分词结果,ICTCLAS的词典 (下转到18页) 氟
电脑编程技巧与维护 或者将其关闭。毕竟集团公司是以利润最大化为目的,只有 5 结语 对于订单分配模型的应用不能仅仅是用它来进行安排生 产,应该进一步挖掘它的用途。它可以为企业集团的重新组 利润提升才能提高各个单位的生产积极性,才能有财力去支 持新技术的研发和市场开拓。 表1子企业的初始分配结果集 l 2 3 4 5 合通过实际的生产安排得出数据,为集团进行重组提供强有 力的数据依据。 C C C C 1 2 3 4 5 BAC BAC BAC BAC BAC CA AC CA CA AC B B B B B B B B 参考文献 Ⅲ1郑海航,等.中国企业兼并研究[M].北京:经济管理出 版社,1999. [2]才婉如.90年代欧美企业兼并浪潮及其对中国的启示[J]. 宏观经济研究,2000,f5). [3]程兆谦.购并整合七法则[J].中外管理,2001,(3). 【4李时椿.中外成功企业并购重组的策略研究[4JJ】.经济管 理,2001,flO). B C 表2最终的企业订单分配结果集 1 2 3 J 4 5 1 2 3 4 5 B C C A B A A A C A B B B B B B B B C C C B C 【5]刘晓冰,王宇春.钢铁企业集团订单分配模型研究【JJ. 西南交通大学学报,2006,(2). [6】Xudongsong,DjLID zhu.Study on enterprise group order a ̄oc- ation muhiobjective model,JCIT,2010(5). (上接第11页) 处理方式可参看((ICTCI ̄S代码学习笔记》15]一文。ICTCLAS 支持用户自定义词典,用户可以在词典中加入自己的词条。 词典处理包括4个函数,其定义如下: function ICTCLASImportUserDict(const pszFileName: _取关键词和文本指纹的例子程序: count:=0: ICTCLASParagraphProcessA(pansicbar(paragraph), count);//首先得到段落分词后的词数 code:=ICTCLASPAnsiChar):integer;cdecl;//导入文本格式的词典,每行一个 ,/词条。pszFileName指定文本文件名,返回导人的词条数量。 function ICTCLASAddUserWord( const FingerPrint 0://取文本指纹 memoresult.Lines.Add(IntToHex(code,8)); sWord: /in 16进制显示 getmem(resultKey,sizeof(resultO count); PAnsiChar):integer;cdecl;//在内存词典中动态增加一个词 /sWord,成功返回l,失败返回0。 unctfion ICTCLASDelUsrWord( const —/,仓U建result_t数组 code__ICTCLASKeyWord(resultKey,count); sWord: PAnsiChar):integer;cdecl;/在内存词典中动态删除sWord词 //条。如果词条不存在,返回~1,否则返回该词条的编号。 function ICTCLAS_,/抽取关键词,1成功0失败 if code>0 then for I:=0 to count一1 d0 begin SaveTheUsrDic 0:integer;cdecl; 鸺内存中的用户词典保存在data目录下的UserDict.pdat中, ,,成功返回l,失败返回0。 3.6其他辅助功能 ICTCLAS还提供了一些附加功能,包括取词的Unigram概 率、段落关键词、段落文本指纹等。其声明如下: function ICTCLASGetUniProb( const —word:=copy(paragraph,resultKey.start+L resultKey. 1ength);脏段落中找到这个词 memoresult.Lines.Add(word+ +inttostr(resultKey. weight));//显示词的权重 Inc(resultKey);/定位到下一个词对象 end; sWord: PAnsiChar):double;cdecl: freemem(resultKey);//释放对象数组 /A区回sWord的Unigram概率(双精度实数值) function ICTCLASIsWord(const sWord:PAnsiChar): _参考文献 …1张华平.ICTCLAS201 1接口文档.北京理工大学计算机语 integer;cdecl;// ̄Ⅱ断词是否在字典中 function ICTCLASKeyWord(resultKey:Presult_t;vat 言信息处理研究所,2011. 【2】刘艺.Delphi面向对象编程思想.北京:机械工业出版社, 2004. nCountKey:integer):integer;cdecl;//] ̄段落关键词,结果存放 脏result_t数组中,数组的维度在nCountkey中,词按其权重 ,/降序排列。函数成功返回l,失败返回0。 function ICTCLAS FingerPrint():longint;cdecl;//文本指 //A提取,须在ICTCLASParagraphProcessA函数执行完后执 ∥行,返回一个整数。 [31 Dependency Walker.http://www.dependencywalker.corrd.201 1. [4张华平.I41CTCLAS2011 Windows下C接口.北京理工大学 计算机语言信息处理研究所,201 1. [5】黄瑾.ICTCLAS代码学习笔记.中科院计算技术研究所多 语言交互技术评测实验室,2006. function ICTCLASSetPOSmap(const nPOSmap:integer1: ~integer;cdecl;肘旨定诃胜标注集 与
版权声明:本文标题:ICTCLAS中文词法分析的Delphi调用研究 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1703177623h441104.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论