自然语言处理专家个人主页信息自动抽取

来源:百度文库 编辑:神马文学网 时间:2024/04/30 02:04:55
饮水思源 - 主题文章阅读  [讨论区: Cantonese] [回复本文] 发信人:Dillon(狄龙), 信区: Cantonese标 题: 自然语言处理专家个人主页信息自动抽取发信站: 饮水思源 (2004年06月08日15:25:44 星期二), 站内信件自然语言处理专家个人主页信息自动抽取班  级:F0003301学生姓名:梁永坚指导教师:李芳 [题目]摘要[摘要正文摘要正文摘要正文摘要正文摘要正文摘要正文。]关键词:[关键词1],[关键词2] [TITLE]ABSTRACT[Body of abstract.]KEY WORDS:[Key Word 1], [Key Word 2] 目录1. 概述 11.1 计算语言学介绍 11.2 应用背景 21.3 上海交通大学计算语言学虚拟信息中心简介 21.4 各章节介绍 22. 信息抽取系统的设计 32.1 信息抽取技术简介 32.1.1 信息抽取的定义 32.1.2 信息抽取的产生 32.1.3 信息抽取的工作流程 32.1.4 信息抽取的关键技术 42.2 “个人主页”信息抽取系统的设计 42.2.1 个人主页的自动搜索 42.2.2 自然语言专家的判别 52.2.3 专家信息的自动抽取 52.3 演示系统的界面 53. 专家信息自动抽取的实现 73.1 开发环境以及开发工具的介绍 73.1.1 Java2 SDK 1.4.2 Standard Edition 73.1.2 IntelliJ IDEA (With MySQL connector) 73.1.3 ICTCLAS 计算所分词系统 83.2 系统界面的实现 83.2.1 界面部分的实现 83.2.2 线程的实现 123.3 专家数据库的介绍 133.4 抽取前端的实现 143.4.1 主页的下载并对主页文本的分词 143.4.2 匹配分词结果 163.4.3 整理匹配结果 203.5 各个字段的抽取方法 213.5.1 共通性特征 213.5.2 姓名的抽取 223.5.3 职称的抽取 223.5.4 电子邮件的抽取 233.5.5 电话的抽取 233.5.6 联系地址的抽取 233.5.7 工作单位的抽取 243.5.8 所属学科的抽取 243.5.9 参与项目的抽取 253.5.10 研究方向的抽取 254. 运行结果及分析 254.1 系统运行的结果 254.1.1 稳定性测试 254.1.2 正确性测试 264.2 有关问题总结和系统的改进建议 264.2.1 分词系统的更换 264.2.2 索引的绝对化 264.2.3 权值的重分配 274.2.4 抽取算法的优化 275. 参考文献 276. 致谢 277. 附录 287.1 ICTCLAS词性标记集规范 287.2 系统使用帮助 29 1. 概述1.1 计算语言学介绍(1) 计算语言学的产生计算语言学(Computational Linguistics)指的是这样的一门学科,它通过建立形式化的数学模型,来分析、处理自然语言,并在计算机上用程序来实现分析和处理的过程,从而达到以机器来模拟人的部分乃至全部语言能力的目的。[1](2) 计算语言学的研究范畴[7]计算语言学为利用计算机处理语言信息(包括语言中信息成分的发现和提取,语言数据的存储、加工和传输,语言的翻译和理解)提供理论模型、计算方法和实现技术,因此考虑问题都是站在计算机的立场上的,这同过去以人为对象的语言研究有着明显的不同。稍微学过一点英语的中国人都不难把第一次见到的下面两句英语正确地翻译成汉语。 I bought a table with three legs.(我买了一张有三条腿的桌子。) I bought a table with three dollars.(我花三美元买了一张桌子。)计算机要翻译这两句话,却碰到了不易处理的歧义结构问题。尽管当代计算机的存储容量极大,但也不可能一一记住所有英语句子的汉语译文。计算机不难记住数量有限的英语句子结构及其对应的汉语句子结构。一般地说,计算机系统里有了这样的知识,就可以通过句法分析和查词典实现自动翻译了。这一步算是句法理论(syntax)的成就。上述两个句子的结构都是: 名词短语+动词+名词短语+介词短语最后的介词短语既可以修饰句中的动词,也可以修饰后一个名词短语。要计算机针对具体的句子决定取舍,可就犯难了。因此要以某种形式给计算机灌输诸如“桌子有腿,用美元可以购物”之类的知识,并要教会计算机如何运用这些知识,这属于语义学(semantics)和语义分析的研究范围。在很多情况下,计算机死记住一些静态的知识还不能消解这种结构的歧义,还要学会分析上下文和谈话的环境,从语境中获取并活用动态的知识,这又要靠语用学(pragmatics)和语境分析(context analysis) 发挥作用了。除了要分析语言,文章生成(text generation)也是一门学问。以上理论都是建立在基于规则的语言模型上的。基于规则的理论模型用于指导语言信息处理实践历史虽久,却常常捉襟见肘。与此同时,计算机技术飞跃进步,这又推动了基于统计模型的语料库语言学(corpus linguistics)的发展。同样,基于统计的理论模型也有其自身的局限性。 有机结合两种模型,不断地实践,并吸收相关学科(如脑科学,认知科学等)的成果,人类理解语言的奥秘总会被逐步揭开,模拟这个过程的自然语言处理系统也会逐渐接近真正理解的目标。语言信息处理是数字计算机在非数值领域的最早应用,50年来,虽历经坎坷,终究取得了长足的进步,并在社会生活中发挥作用。计算语言学从定名起,也有了30多年的历史,已成为一个稳定而且活跃的学科。1.2 应用背景本系统的设计实现是在虚拟信息中心建立以后。由于当今数据量巨大,已经不再可能通过人手统计。为了完善虚拟信息中心,在最初的生产实习中是通过人为统计的,效率非常低。在信息抽取技术相对成熟的今天,利用信息抽取的方法取代人为统计成为可能。本系统就是在此背景下设计并且实现的,采用信息抽取的技术,从互联网中搜索并抽取需要的信息完善虚拟信息中心。1.3 上海交通大学计算语言学虚拟信息中心简介《上海交通大学计算语言学虚拟信息中心》于2003年作为朱晓明的毕业设计[1]所创建,其设计来源于LT-World(语言技术世界,www.lt-world.org)。《交大计算语言学虚拟信息中心》的设计目的是构造一个收集国内NLP专家资料的数据库,模仿LT-World向业界内发放。本中心的主页面如下所示: 1.4 各章节介绍本文的第2章简单了本系统用到的信息抽取技术并且对本系统的设计作了一个大体的概括。第3章是整个系统的详细设计与实现,是本文的主题部分。第4章是实验的结果并且提出了一些问题已经改进建议。2. 信息抽取系统的设计2.1 信息抽取技术简介2.1.1 信息抽取的定义信息抽取(Information Extraction),指从一段文本中抽取指定的一类信息并将其形成结构化的数据填入一个数据库中供用户查询使用的过程。[2]MUC(Message Understanding Conference)定义的文本抽取:从纯文本字符串形式的文本中提取信息并进行处理,将其放入标记了可填入信息类型的槽中。[2]如:George BushCannon2.1.2 信息抽取的产生随着计算机的普及以及互联网(WWW)的迅猛发展,大量的信息以电子文档的形式出现在人们面前。为了应对信息爆炸带来的严重挑战,迫切需要一些自动化的工具帮助人们在海量信息源中迅速找到真正需要的信息。信息抽取(Information Extraction)研究正是在这种背景下产生的。[3]2.1.3 信息抽取的工作流程Hobbs曾提出一个信息抽取系统的通用体系结构[13],他将信息抽取系统抽象为“级联的转换器或模块集合,利用手工编制或自动获得的规则在每一步过滤掉不相关的信息,增加新的结构信息”。Hobbs认为典型的信息抽取系统应当由依次相连的十个模块组成:① 文本分块:将输入文本分割为不同的部分——块。② 预处理:将得到的文本块转换为句子序列,每个句子由词汇项(词或特定类型短语)及相关的属性(如词类)组成。③ 过滤:过滤掉不相关的句子。④ 预分析:在词汇项(Lexical Items)序列中识别确定的小型结构,如名词短语、动词短语、并列结构等。⑤ 分析:通过分析小型结构和词汇项的序列建立描述句子结构的完整分析树或分析树片段集合。⑥ 片段组合:如果上一步没有得到完整的分析树,则需要将分析树片段集合或逻辑形式片段组合成整句的一棵分析树或其他逻辑表示形式。⑦ 语义解释:从分析树或分析树片段集合生成语义结构、意义表示或其他逻辑形式。⑧ 词汇消歧:消解上一模块中存在的歧义得到唯一的语义结构表示。⑨ 共指消解或篇章处理:通过确定同一实体在文本不同部分中的不同描述将当前句的语义结构表示合并到先前的处理结果中。⑩ 模板生成:由文本的语义结构表示生成最终的模板。当然,并不是所有的信息抽取系统都明确包含所有这些模块,并且也未必完全遵循以上的处理顺序,比如6、7两个模块执行顺序可能就相反。但一个信息抽取系统应当包含以上模块中描述的功能。[3]2.1.4 信息抽取的关键技术(1) 命名实体识别命名实体是文本中最基本的要素,要正确地理解文本就要正确地识别命名实体。命名实体可以表示现实世界中的抽象或者具体的事物,诸如姓名、单位、公司名、时间、地点等等。但是命名实体还是需要根据实际情况确定的。在本毕业设计中,有如下命名实体:姓名、职称、单位、学科、电话、地址、E-Mail、主页、项目和研究方向。(2) 句法分析句法分析得到输入的某种结构表示,如完整的分析树或分析树片段集合,是计算机理解自然语言的基础。[3](3) 篇章分析和推理通过为了准确而没有遗漏地从文本中抽取相关信息,信息抽取系统必须能够识别文本中的共指现象,进行必要的推理,以合并描述同一事件或实体的信息片段。因此,篇章分析、推理能力对信息抽取系统来说是必不可少的。[3]在本毕业设计中,只涉及到命名实体的识别,属于一种浅层的信息抽取。2.2 “个人主页”信息抽取系统的设计2.2.1 个人主页的自动搜索个人主页的自动搜索可以从两方面入手,其一就是URL,个人主页的URL都具有一定的特性,比如~、#、?name= 等符号特征,属于浅层的搜索;其二就是网页的内容,个人主页的内容可能含有相似的关键字,诸如简介、XX的主页之类的字眼。对个人主页的识别主要的方法是对满足某一特征的网页加以一个权值,权值达到某一固定值就可以判断该网页属于个人主页。每一特征的权值以及权值的界限都必须经过大量试验来验证,才能获得很好的结果。此种方法属于一种经验型的方法,可以看到在后面的自然语言专家的判别也用到了这种方法。此方法的好处是随着试验的越来越多,系统会更加完善。个人主页的搜索还用到了广度搜索,对初始网页广度递增的搜索,搜索到第五层即结束。用广度搜索代替深度搜索可以更快的得到结果,主要是可以在早期排除深层次的非个人主页。整个过程都在维护一张先进先出的表,表里面保存的是按照广度搜索对第一个页面的不停向下搜索所得到的URL。然后对表里面的URL做检查,判断出个人主页。2.2.2 自然语言专家的判别自然语言专家的判别也用了跟个人主页判断相似的办法,就是对含有某一关键字的网页加权,如果到达某一权值就判断该网页属于自然语言专家的个人主页。但是关键字的选取就具有一定的难度,主要是关键字的选取。最后,关键字的选取由已知的NLP专家的个人主页统计得出,约50个高频词汇。自然语言专家的判别主要分两步,第一步是个人主页的判别,第二步是自然语言专家的判别。2.2.3 专家信息的自动抽取专家信息的自动抽取是一种命名实体的抽取,并夹带着少量的推理。抽取采用了有限自动机的方法,对灵活的规则进行匹配。当然,匹配的基本元素不能采用落后的字符,这样的话就失去了中文词语原有的特性。取而代之的是单个词,采用了ICTCLAS的分词系统对文本进行分词。对匹配后的大量结果进行附加特性以及整理就得到了中间结果。最后对每一类的命名实体采用不同的抽取方法,其中用到最简单的推理。最后的结果的正确性是基于两方面的,一方面是ICTCLAS的分词的准确性,另一方面是抽取算法的好坏。最后的抽取结果可以保存到现在的计算语言学虚拟信息中心。2.3 演示系统的界面主程序界面 主界面包括6部分。① 菜单,如下所示: 菜单包含了所有操作的选择,另外附带一个初始化菜单,用于将整个系统初始化。② 初始化URL,用于输入搜索的入口URL,整个系统将从这个URL入手搜索。③ 个人主页列表,用于收集搜索到的个人主页。④ NLP个人主页列表,用于收集判断为NLP专家的页面。⑤ 快捷按钮,实现菜单的功能的快捷键。⑥ 当前状态,有两个数字,一个是个人主页的数量,另一个是NLP主页的数量。规则管理器界面 规则管理器界面上方是一个规则列表,下方是选定的规则的详细信息列表,右方有一系列操作按钮。规则管理器的操作将会在附录中说明。信息抽取结果显示界面 3. 专家信息自动抽取的实现3.1 开发环境以及开发工具的介绍3.1.1 Java2 SDK 1.4.2 Standard Edition采用Java开发是因为Java具有平台无关性,开发出来的软件可以跨平台使用。而且Java是一种相当好的语言,可以保证出现最小的错误,减少程序员的失误。Java2 SDK 1.4.2 SE是Java2开发包标准版的最新版本。在这个版本中,已经包含了java.util.regex包,包里面包含了两个类Pattern、Matcher。因此,此版本J2SDK已经可以根据正则表达式匹配字符串了。3.1.2 IntelliJ IDEA (With MySQL connector)(1) IntelliJ IDEA 4.0IntelliJ IDEA是一个相对较新的Java IDE。高度优化的IntelleJIdea使普通任务变得相当容易。通常不是较大的标签特性使一个产品真正有用。而是这些小的方面:里面的许多小的细节使整个包无缝集成及乐于使用。IntelliJ IDEA具有如下特征:感知语法词选择 多种导航形式 本地历史 灵活JUnit支持 整合支持代码助手 代码重格式化 XML支持 直观简洁的GUI FS自动同步定制的键盘映射 错误高亮显示 代码检查 完全理解JSP 灵巧的编辑功能支持EJB 灵巧的模板 代码实现支持 集成Ant 无代码高亮显示技巧众多 有规律的查找 快速JavaDoc 意识动作 几乎没有向导(2) MySQL connector for java 3.0.11 stable这是MySQL的连接驱动的最新稳定版。在java的开发包中并没有包括MySQL数据库的连接驱动,需要第三方的支持。驱动程序是一个jar的包,安装工程里面编译就可以正常使用了。3.1.3 ICTCLAS 计算所分词系统中国科学院计算技术研究所在多年研究基础上,耗时一年研制出了汉语词法分析系统ICTCLAS(Institute of Computing Technology, Chinese Lexical Analysis System),该系统的功能有:中文分词;词性标注;未登录词识别。分词正确率高达97.58%(973专家组评测),未登录词识别召回率均高于90%,其中中国人名的识别召回率接近98%处理速度为31.5Kbytes/s。ICTCLAS的特色还在于:可以根据需要输出多个高概率结果,有多种输出格式,支持北大词性标注集,973专家组给出的词性标注集合。计算所汉语词法分析系统ICTCLAS同时还提供一套完整的动态连接库ICTCLAS.dll和相应的概率词典,开发者可以完全忽略汉语词法分析,直接在自己的系统中调用ICTCLAS,ICTCLAS可以根据需要输出多个高概率的结果,输出格式也可以定制,开发者在分词和词性标注的基础上继续上层开发。3.2 系统界面的实现整个系统界面都是独立于系统的内核的,系统界面的实现包括两部分,其一就是界面部分的设计,其二就是线程的独立运作部分。整个系统界面都放在UI这个包里面,而线程就放在UI.Runner包里面。由于要实现平台无关性,所以并没有使用IDEA所携带的UI编辑器对用户界面进行编辑,取而代之的是手动实现,而且这样显得更加灵活。3.2.1 界面部分的实现其中只有主界面是JFrame,其他几面都是JDialog。详细功能见下表:类名 基类 功能MainFrame JFrame 主界面的整个界面设计MessageDialog JDialog 信息抽取后的显示信息界面RulemanagerDialog JDialog 规则管理器的界面ErrorDialog JDialog 错误报告的界面AboutDialog JDialog 关于界面(1) MainFrame主界面MainFrame包含了两个非可视化容器的属性,分别是URL_LIST和NLP_LIST,都是Vector类型,用于保存当前的个人主页和NLP主页的列表。为什么要使用Vector了,是因为需要嵌入到Jlist中作为数据显示。所以MainFrame的两个对应的非常重要的容器就是URL_List和NLP_List,分别将URL_LIST和NLP_LIST作为链表数据。只要刷新整个UI,两个Vector里面的数据将会通过两个JList显示出来。MainFrame相对其他JDialog的差别还在于多了一个菜单,整个菜单只有单级菜单,这是因为菜单项比较少的缘故。但是菜单项仍然分类显示,分4项。第一是功能项,即“获取个人网站”、“过滤NLP个人主页”、“获取网页信息”三项;其次是“规则管理器”,这一项是独立出来作为系统配置项的;再次是“系统初始化”,用于对系统的还原;最后是“退出”。MainFrame还包括三个快捷按钮和一个信息提示框。三个快捷按钮对应着菜单功能项的三个功能,置于整个界面的右方偏上,使得系统在使用上比较方便。在快捷按钮下方有一组信息提示,包括两个列表当前URL的个数。MainFrame属性表属性 类型 说明URL_LIST Vector 保存个人主页的向量NLP_LIST Vector 保存NLP个人主页的向量menubar JMenuBar 菜单模块menu_system JMenu 0级系统菜单模块menu_help JMenu 0级帮助菜单模块item_geturl JMenuItem 菜单项“获取个人主页”item_urlfilter JMenuItem 菜单项“过滤NLP个人主页”item_parse JMenuItem 菜单项“获取网页信息”item_rulemanager JMenuItem 菜单项“规则管理器”item_initial JMenuItem 菜单项“系统初始化”item_exit JMenuItem 菜单项“退出”item_about JMenuItem 菜单项“关于”text_firstURL JTextField 用于填写搜索入口的URL的文本区域URL_List JList 个人主页的显示模块NLP_List JList NLP个人主页的显示模块btn_geturl JButton 快捷按键“获取个人主页”btn_urlfilter JButton 快捷按键“过滤个人主页”btn_parse JButton 快捷按键“获取网页信息”mess_url JLabel 用于提示当前个人主页的数量mess_nlp JLabel 用于提示当前NLP个人主页的数量runner_get Thread 获取个人主页的线程runner_filter Thread 过滤个人主页的线程MainFrame需要响应菜单以及快捷键。本Frame中包含两个线程,用于响应两个功能:“获取个人网站”和“过滤NLP个人主页”,对应两个菜单项和两个按钮。对其他菜单项和按钮的响应则不需要线程的支持,只需要弹出对应的窗口或者关闭程序就可以了。MainFrame事件响应表事件源 类型 说明item_geturl ActionEvent 响应菜单“获取个人主页”item_urlfilter ActionEvent 响应菜单“过滤NLP个人主页”item_parse ActionEvent 响应菜单“获取网页信息”item_rulemanager ActionEvent 响应菜单“规则管理器”item_initial ActionEvent 响应菜单“系统初始化”item_exit ActionEvent 响应菜单“退出”item_about ActionEvent 响应菜单“关于”btn_geturl ActionEvent 响应按键“获取个人主页”btn_urlfilter ActionEvent 响应按键“过滤个人主页”btn_parse ActionEvent 响应按键“获取网页信息”(2) MessageDialog信息抽取结果显示对话框MessageDialog有10个文本区域、4个按钮、1个列表和1个状态栏组成。其中10个文本区域分别对应着数据库中相应的10字段,用于显示抽取结果,并且可以直接修改抽取结果以保存到数据库中。在文本区域的下面放置了4个按钮“上一条”、“下一条”、“保存到数据库”和“退出”。垂下是一个错误报告列表,报告当前遇到的问题。最下面是状态栏。MessageDialog属性表属性 类型 说明URLs Vector 保存NLP个人主页列表的向量index int 保存当前处理的URL的位置text_name JTextField 文本域“姓名”text_job JTextField 文本域“职称”text_url JTextField 文本域“个人主页”text_email JTextField 文本域“电子邮件”text_tel JTextField 文本域“联系电话”text_addr JTextField 文本域“联系地址”text_unit JTextField 文本域“工作单位”text_sub JTextField 文本域“所属学科”text_item JTextField 文本域“参与项目”text_tech JTextField 文本域“研究方向”btn_prev JButton 按键“上一条”btn_next JButton 按键“下一条”btn_save JButton 按键“保存”btn_exit JButton 按键“退出”list_errors JList 错误列表label_status JLabel 模拟状态栏MessageDialog构造或者“上一条”、“下一条”按钮事件,都会启动一个线程读取NLP个人主页向量的当前值,然后去处理,将处理结果反馈到对话框。如果遇到错误,最后错误将会显示在错误列表中。NLP个人主页向量是MainFrame中NLP个人主页向量的引用,随着MainFrame得到更多的结果,向前向后搜索抽取会不停的增加URL。MessageDialog事件响应表事件源 类型 说明btn_prev ActionEvent 响应按键“上一条”btn_next ActionEvent 响应按键“下一条”btn_save ActionEvent 响应按键“保存到数据库”btn_exit ActionEvent 响应按键“退出”响应“保存到数据库”按钮事件所做的操作就是查到数据库,如果存在该记录而且该记录跟当前即时抽取发生冲突的时候就修改当前记录,如果不存在该记录就增加一条记录,否则对数据库没有任何操作。数据库的连接以及SQL语句的运行被独立的提取出来放在Datebase.Connector的类里面作为构造函数和成员函数,这样使得对数据库的操作在Connector之外变得透明。由于数据库默认的编码不是GBK,所以对数据库的读取和写入必须转码。在Connector中有两个静态函数用于转码,是“ISO_8859-1”跟“GBK”两种编码的相互转变。由于没有找到状态栏的专门的容器,所以用了一个JLabel代替。这样的话必须保证JLabel里面的Text非空,否则状态栏会消失。另外此对话框还有还有一个私有函数,用数对按键可用性的刷新,当到了向量边沿的时候,“上一条”或者“下一条”的按键就会失灵。(3) RulemanagerDialog规则管理器对话框RulemanagerDialog是最复杂的一个容器,它的功能就是读入规则文件,然后对其进行修改,以更加完善系统,使得抽取的正确性、完整性得到提高。此Dialog同样具有两个JList,此外还有一些按钮和文本区域。第一个JList是用于显示规则文件的所有记录的,第二个JList是用于显示规则文件的详细信息的。此外还有,几个文本区域用于输入规则用的。RulemanagerDialog属性表属性 类型 说明rules Vector 保存所有规则的向量detail Vector 保存一条规则所有标记的向量rulefile File 当前打开的规则文件list_rules JList 规则列表list_detail JList 标记列表text_weight JTextField 权重显示和输入的文本域btn_weight JButton 设置权重的按键btn_append_onerule JButton 增加一条规则的按键btn_delete_onerule JButton 删除一条规则的按键btn_openfile JButton 打开文件的按键btn_save JButton 保存到数据库的按键btn_close JButton 退出当前对话框的按键btngrp_type ButtonGroup 单选框的分组btn_type_type JRadioButton 类型单选框btn_type_word JRadioButton 字符单选框text_value JTextField 标记内容的文本域text_times JTextField 标记出现频率的文本域btn_insert JButton 在当前位置插入标记的案件btn_append JButton 在尾部追加标记的按键btn_delete JButton 删除当前标记的按键btn_update JButton 更新当前标记的按键text_originword JTextField 分词前的原语btn_parse JButton 分词构造规则的按钮此对话框响应两类型的操作,一类是普通的响应,另一类是Jlist的选择响应。当打开文件后,就向rules向量填充数据,在list_rules中显示出来。当选择list_rules中的元素的时候,就会刷新一个表示权值的文本区域和details向量,将该rule的详细信息表示出来。当选择list_details时就要刷新单选按钮和两个文本区域,将当前标记的属性显示出来。另外设计了几个按钮用于修改标记和规则的。RulemanagerDialog事件响应表事件源 类型 说明btn_openfile ActionEvent 响应按键“打开规则文件”btn_weight ActionEvent 响应按键“修改权值”btn_append_onerule ActionEvent 响应按键“增加规则”btn_delete_onerule ActionEvent 响应按键“删除规则”btn_update ActionEvent 响应按键“修改”btn_delete ActionEvent 响应按键“删除”btn_insert ActionEvent 响应按键“插入”btn_append ActionEvent 响应按键“追加”btn_parse ActionEvent 响应按键“分词构造规则”btn_save ActionEvent 响应按键“保存”list_rules ListSelectionEvent 响应列表选择“规则列表”list_detail ListSelectionEvent 响应列表选择“详细信息列表”(4) ErrorDialog错误对话框和AboutDialog关于对话框ErrorDialog和AboutDialog属于信息提示框,前者用于提示出错信息而后者提示演示系统相关信息。3.2.2 线程的实现为了使得系统在运行中不会因为获取网页的耗费时间的工作使得系统处于半死状态,增加了线程支持。本系统具有三个线程类,Get_List用于获取个人主页,Filter_List用于过滤NLP个人主页,IE用于抽取网页信息。所有线程类都实现了Runnable接口,接口包括一个返回void无参数的run函数。run函数实际上就是线程的主题部分。(1) Get_List类Get_List类含有一个MainFrame类型的属性ctrl_frame,运行期间作为调用者MainFrame的引用,用以操作MainFrame的公有属性。当线程运行的时候,整个过程是:设置菜单和按键“获取个人主页”为无效?设置菜单和按键“过滤个人主页”无效?设置菜单和按键“获取网页信息”无效?调用私有函数search(以初始URL作为入口)?设置菜单和按键“过滤个人主页”有效。search函数负责个人主页的搜索,由李旻庆[5]同学完成。(2) Filter_List类Filter_List类同样含有MainFrame类型的属性ctrl_frame,其作用跟Get_List类里面的一样。线程的运行过程是:设置菜单和按键“过滤个人主页”为无效?执行私有函数filter?设置菜单和按键“过滤个人主页”为有效?设置菜单和按键“获取网页信息”为有效。其中私有函数filter是一个单次循环过程,即对当前的个人主页列表进行一次过滤,结果是NLP个人主页列表。其工作过程如下: (3) IE类IE类含有一个MessageDialog类型的属性,运行期间作为调用者MessageDialog的引用,以使得IE可以控制MessageDialog的对象的公有属性。IE的过程:指所有文本域为空?调用私有函数extract?刷新按键。extract函数用Extraction包里面的类构造对象实现信息的抽取。3.3 专家数据库的介绍为了保存NLP专家数据,计算语言学虚拟信息中心的设计采用了5张Table保存相关数据,其中保存专家信息的表的结构如下所示:[1]表名:individual (专家);描述:从事计算语言学领域研究和开发工作的国内专家信息;表结构:字段名 数据类型 描述Name VARCHAR(20) 姓名Position VARCHAR(100) 职称Homepage VARCHAR(100) 个人主页Email VARCHAR(100) 电子邮箱Telephone VARCHAR(20) 电话Address VARCHAR(255) 联系地址Affiliation VARCHAR(255) 所属单位Subject VARCHAR(255) 所述学科Project VARCHAR(255) 参与项目Research VARCHAR(255) 研究方向主键码 (Name,Affiliation)本系统得目的就是实现网上自动搜索、抽取出感兴趣的信息填充该数据表。该数据表共有10项对应不同类型命名实体。为了实现自动抽取,必须对当前数据表有一个充分的理解。本数据库采用MySQL实现,就单个数据表并没有什么问题,但是这个数据库中并没有用到外键码,所以Research的多个抽取结果之间要用、(顿号)隔开,这是原有设计所决定的。本数据库安装在202.120.25.16:63306里面,在任何一台机器都可以访问。所以本系统可以运行在不同的机器上面。3.4 抽取前端的实现为了使得抽取客观化、智能化,用中文单词代替单个字符作为基本元素,单词是通过ICTCLAS分词系统获得的。对分词结果使用有限自动机的原理,按照给定的规则匹配,得到一系列的结果。再将这些结果加入特征并作相应的处理就得到了中间结果。这些操作都属于抽取的前端,因为对所有的字段这些操作都是通用的。3.4.1 主页的下载并对主页文本的分词(1) 下载一个页面在Java中下载一个页面非常简单,只要对URL类的对象使用openStream函数就可以获得该对象多对应的URL了。当下载了一个页面文件之后,还要对文件进行处理,去除文件中的标记。HTML的标记通常具有如下格式:Content。只要将Content取出来就可以了。对文本的筛选用到了J2SDK1.4的新功能,就是Pattern和Matcher两个类。用正则表达式(Regular Expression)提取尖括号里面的内容。任何一个标记之间的内容都作为一个字符串进行分词,分次结果将作为独立的链,将所有这些链在组成成一条链就成为了分词的最终结果。(2) 对单链分词ICTCLAS的源代码是可以下载,但是下载下来的源代码是VC开发的演示程序,要使用还得自行修改成dll文件[6]。要使用dll库必须有一个独立的类包含一些列本地静态函数作为dll的入口。在本系统中,这个类就是ICTCLAS.ICTCLAS,类源程序如下:package ICTCLAS;public class ICTCLAS {static {System.loadLibrary("ICTCLAS");}public native static boolean ICTCLAS_Init();public native static boolean ICTCLAS_Exit();public native static String ICTCLAS_ParagraphProcess(String sParagraph);public native static String ICTCLAS_SentenceProcess(String sSentence, int nResultCount);}其中,System.loadLibrary是载入dll库用的。第一个函数是构造函数;第二个函数是析构函数;第三个函数是对参数字符串分词返回结果;第四个函数是返回多个分词结果的函数。其中第三个函数使用最多。采用ICTCLAS分词之后,得到的结果是一个以空格隔开的一系列的词语以及他们的词性的字符串。对该字符串采用正则表达式匹配后可以得到每一个词语的内容和词性。将这些分词结果用一个类Word来封装,然后组成两级练表,就得到整个主业的分词结构了。分词结构如下所示: (3) 具体实现整个获取网页过程都放在Parser这个包里面了。其中Word类是用于表示单个分词的数据结构,具有两个String类型的域word和type。构造函数的参数是一个字符串,输入分词后的单一一个分词结果将构造一个可以表示该分词全部特性的实例。另外一个Parser类,所有函数都是静态函数,因为它们都只是一个过程,而不是存在于实际中的某种抽象。Parser共有7个静态函数。● public static void SaveToFile(String URL, String filename)此函数是为调试而设计的,功能是将URL得到的分词结果保存到文件filename里面,分词的获得是调用Parse函数的。● public static LinkedList GetFromFile(String filename)此函数也是为调试设计的,功能是将SaveToFile保存的结果重新读取出来。● public static LinkedList Parse(String URL)这是整个类的主体部分。整个过程是一个循环,每一个循环是先获得URL文档,然后调用seperate将文档分词,最后将分词结果整理成为上面所谈到的数据结果。在分词之前,需要调用filtrate过滤一些不必要的字符。● private static LinkedList seperate(String unseperatedString)分词函数,调用ICTCLAS.ICTCLAS进行分词,每次读入一条链,返回分词结果链表就是上图中的二级链表● public static String getSubString(LinkedList parseResult, int start, int end)按照索引读取分词结果链表中的元素,将元素重新串起来成为字符串返回。其中parseResult是分词结果链表,start是开始索引,end是结束索引。● public static String getTagString(LinkedList parseResult, int indexIn)此函数的作用是,返回分词结果链表中的含有indexIn索引的二级链表所代表的字符串。● private static String filtrate(String input)过滤函数,将无用的符号都过滤掉。其中保留了字母、数字、中文字符以及一下特殊字符:@、.、:、;、:、-、_、,、,、。、<、>、《、》、(、)、[、]、【、】、&、、、;、?、?、%、!、!、#。3.4.2 匹配分词结果(1) 规则规则是根据有限自动机的原理和中国科学院计算技术研究所词法分析系统ICTCLAS[7]的分词结果制定的。中文词语切分系统的输入是一个句子,输出是这个句子的分词,并且包含每个分词的词性。也就是说结果是一个有续集合,集合的元素是单词,每个单词包含单词的内容以及单词的词性。比如说,上海交通大学,分次结果是:上海/ns 交通/n 大学/n,其中ns指地名、n指普通名词,更多的词类简写请参看附录。如何从这些分词结果中抽取出需要的信息呢?比如上海交通大学整个词而不是孤立的一个词。由此,使用规则的方法应运而生,规则的想法是从分词结果萌发的。首先是表达一个孤立的词,可以有两种表达方法,其一就是精确匹配,比如精确匹配“上海”这个词;其二就是类型匹配,比如匹配ns的话,也可以匹配到“上海”,同时还有“北京”、“伦敦”等等。“W:上海”表示精确匹配“上海”,而“T:ns”表示类型匹配地名,可以是“上海”、“北京”等。为了方便计算,在每一个标记后面加了一个出现次数的标记,其中大于等于1的表示准确的匹配n个同内容或者同类型的分词。例如:W:上海@1表示准确匹配一个“上海”,T:n@5表示准确匹配5个名词。如果次数的标识是*号,表示匹配任意个(包括0个)。例如:T:n@*表示匹配任意个名词,诸如“交通大学”、“古董磁带录音机”或者空串等等。但是如果次数标记是+的话,就表示1或者多次。如T:n@+只能表示“交通大学”和“古董磁带录音机”而不能表示空串。具体如下表:标记 意义 例子n(n>=1) 精确匹配指定个数 T:ns@1匹配一个地名* 匹配任意个 T:n@* 匹配任意个名词,包括0个即空串+ 匹配一或者多个 T:n@+ 匹配至少一个名词,可以多个将上述的每一个分词的规则表示用“/”隔开串成一起即表示按顺序匹配一个短语。比如T:ns@1/T:n@1/W:大学@1,首先是匹配一个地名,然后是匹配一个名词,最后精确匹配“大学”这个词。上海交通大学就可以用这个规则匹配出来,上海—地名、交通—名词、大学—精确匹配;西安交通大学、台湾交通大学、哈尔滨工业大学等等也可以用这一条规则匹配。当有了上文的规则的时候,已经可以抽取出来需要的短语了,但是不能通过一条规则将所有需要的同一类型短语抽取出来,而每条规则抽取的结果哪个更加有用难以分辨,所以加入了权重这个属性。每一条规则都有其自身的权重,匹配规则的短语具有规则所指定的权重,而匹配后的多个结果经过一系列的计算就可以抽取出权重最高的结果。这样的做法可以通过修改权重来达到更高正确率。权重是在上文的规则前面加入H:权重数字# 的前缀,比如H:1001# T:ns@1/T:n@1/W:大学@1使得该条规则的权重为1001。权值为0具有特殊意义,下文中将会提到。总体来说,一条规则的产生式可以如下表示:RULE ? HEIGHT # LINKHEIGHT ? H: numberLINK ? TAG TAGS*TAGS ? / TAGTAG ? TYPE: contentTYPE ? WTYPE ? T其中开始符是RULE,number指数字,content指可打印字符。(2) 算法虽然匹配过程用到了有限自动机的技术,但是匹配算法并不是有限自动机,而是比有限自动机简单的多得模型。整个算法都放在Matcher包里面了。Matcher包所含的类如下:类名 说明MatchWord 标记匹配的基类 TMatch 词性匹配类,继承MatchWord WMatch 内容匹配类,继承MatchWord MatchedWord 匹配后的结果的数据结构表示 Matcher 单个规则的匹配器Rule 规则表达 LinkMatcher 整个链表的匹配器● MatchWord的子类TMatch和WMatch的匹配算法以规则的一个基本标记作为构造函数的入口,按照规则说明构造一个标记匹配器。这两个类的一个很重要的函数就是public String getMatched(ListIterator list)该函数的功能就是对当前的ListIterator的当前位置开始匹配,如果匹配规则,则返回匹配字符串,否则返回空。整个函数的工作流程大致为:先判断标记频率,分成三种情况。1、*任何个数,那么采用一个while{}循环实现,这种情况是永远都有返回值得;2、+至少一个,那么采用do{}while实现,这种情况下只要匹配第一个就算成功,不管后面有多少个,所以当且仅当第一次匹配失败才返回空,其他情况都有相应的返回值;3、固定个数,该情况用了一个for循环实现,只要当中某一个匹配失败,就要向前退回几个标记,并且返回空,当且仅当整个循环都匹配成功才返回正确值。● Matcher类,单规则匹配器Matcher的构造函数包含一个String类型的参数input,实际上就是一条规则的表达。整个构造函数就是构造一个以MatchWord的子类的实例为元素的链表。此构造函数首先分解input为多个标记,然后按照标记的顺序构造链表。对每一个标记,先判断是“T”开头还是“W”开头,前者就用TMatch构造MatchWord实例,后者就用WMatch。Matcher的唯一一个方法就是getMatch,具有ListIterator类型的参数list。getMatch按照构造的时候得规则从list的当前位置开始匹配,如果匹配成功返回匹配结果,如果匹配失败,返回空。整个工作过程都依赖着MatchWord的两个子类TMatch和WMatch。首先是读取规则链表,看看当前的标记是“TMatch”类的实例还是“WMatch”类的实例,分别强行类型转化,然后对list调用当前标记的getMatched方法获取结果。如果整个过程都匹配成功的话,将每一次的匹配结果串起来返回;但是如果中间某一次的匹配失败的话,直接返回空。Matcher的getMatch的正常返回结果是构造其对象的规则对当前list的当前位置的匹配结果。● LinkMatcher类(Rule类和MatchedWord类)LinkMatcher依靠着Rule和MatcherWord。实际上Rule是Matcher的抽象,每一个Rule的实例都有自己的Matcher实例和一个整形变量weight(权重)。Rule的实例化过程就是将一条规则取出头部H:number的number作为weight,剩下的尾部用作构造matcher。将Matcher抽象出来成为Rule线的更加科学,直观(可以将weight置于Matcher的一个属性)。另外,MatchedWord是表示单个抽取结果的数据结果的类。MatchedWord具有3个域:index(int)当前匹配字的索引,即当前匹配字在文本中的位置(注意,这里并不是绝对位置,而是按照整个分词安排的位置);word(String)当前匹配字的内容,是匹配成功的结果;weight(int)当前匹配字所满足的规则的权重,任何匹配成功的匹配字都赋予其所满足的的规则的权重值。LinkMatcher的构造实际上就是构造一个链表,链表的元素是Rule的实例,整个LinkMatcher都依靠这个链表工作。最开始的设计是保存一个没有解析的规则的链表的,每次匹配在重新解析规则,这样做的话时间上耗费太多了,取而代之的是用空间换取时间,保存解析后的规则。LinkMatcher的工作过程完全封装在getMatch函数里面,函数的参数是一个LinkedList类型的parseResult,即第1节所述的下载并且分词的结果。getMatch的工作过程如下: (3) 结果匹配的结果是一个以MatchedWord实例为元素的链表,每一个接点元素(MatchedWord的实例)都有三个基本属性:索引、内容以及权值。匹配的结果比较混乱,也有不少重复,而且,根据规则出来的结果很多都具有包含关系。这样的话,匹配的结果一定需要经过整理才能用于最后的抽取。3.4.3 整理匹配结果匹配结果的整理是一个合并过程,合并有两种,一是非包含性合并,而是包含性合并。非包含性合并就是两个必配结果一个包含另一个的内容,但是两个内容有天渊之别,不能合并,比如:教授和副教授;包含性合并就是内容间可以相互合并,因为较长的结果更具有准确性,比如:上海交通大学和上海交通大学计算机系。两种合并方法并没有分开实现,而是放在同一个函数里面实现了。整理后的结果也不同于整理前的,主要是每一个匹配字都已经不只是一个索引,而是一系列索引(包含所有合并字的索引的集合)。整理过程分三步走,归并、二次归并以及索引归并,下文将讲述这三步如何实现。在这之前先讲述一下所用到的数据结构。整个合并器都放在Merger的包里面。(1) 类Entity – 匹配结果的数据结构Entity类具有三个域:LinkedList类型的indexs索引列表,int类型的weight权值,String类型的word内容。其中需要说明的是indexs的元素是Integer的实例,并不是int,使用Integer是因为LinkedList里面的元素都必须是Object,不能是基本数据类型。Entity具有两个函数,一是构造函数,二是刷新函数,两个函数的参数都是MatchedWord的实例,刷新函数还具有布尔型参数exact用于控制选用的合并方法。构造函数从一个MatchedWord的实例初始化一个Entity实例,该实例的索引列表只含有原来的MatchedWord实例的索引,权重内容也是一样的。refresh函数根据参数matched和exact修改自身的属性。根据exact的真假,对内容进行判定,如果为真就判断自身的内容和matched的内容是否绝对相等,否则就判断两者是否有包含关系。如果exact为真且内容绝对相等就将其权值直接相加,而且将新的索引追加到indexs的尾部。如果exact为假且内容含有包含关系的话,设定自身的word为包含者,同时追加索引,权值设置为内容较长的matched的权值加上内容较短的matched的权值乘以短长度跟长长度的比例。refresh函数如果合并成功返回真,否则不能合并的话就返回假。(2) 函数Merge – 匹配过程Merge含有两个参数:LinkedList类型的matcherResult和boolean类型的exact。● 归并第一次的归并实际上就是对matcherResult(LinkMatcher的匹配结果)进行简单的压缩。整个过程就是对新建立的链表跟matcherResult进行完全的对比,新的链表是以Entity的实例为元素的。遍历matcherResult整个链表,对matcherResult的每一个MatchedWord实例对新的链表进行全表刷新,如果没有一个Entity实例刷新成功的话,将此MatchedWord实例构造Entity实例并加入到新的链表。● 二次归并由于第一次归并过程极其简单,对非精确归并存在遗漏问题,所以就需要二次归并了。精确归并不存在非精确归并所具有的问题,所以不需要经过二次归并。归并的问题:由于归并是顺序话的,所以错位归并的字符串就会被分成两个Entity实例,比如:上海交通大学和交通大学计算机系,同时还会产生上海交通大学计算机系。很明显,前两者都必须归并到第三者那里的。关于问题的产生,用上面的例子说明一下:首先匹配到的是上海交通大学,然后由匹配到交通大学计算机系,按照归并算法后者不能归并到前者,因此产生了两个Entity实例,紧接着又匹配到了上海交通大学计算机系,按照归并算法被归并到第一个Entity实例。这样第二个Entity实例的确不应该存在,而且需要归并到第一个。精确匹配的话是不存在这种情况的。二次归并实际上就是对归并的结果链表重新构造一次,将多余的Entity实例合并,算法跟归并类似。权值的计算稍有不同,二次归并的权重的重分配是将高权值跟低权值的差值附加到高权值中。● 索引归并到这里,归并的内容已经没有重复,而且权值也得到合理分配,但是索引还没有整理过。在以上部分,有可能某些Entity实例的索引列表有重复,所以必须对每一个Entity实例的索引列表进行过滤,删除重复的所索引。索引归并的算法实际上就是双重循环,第一重是对整个结果链表遍历,第二重是对每一个Entity实例的索引链表遍历,将多余的索引删除。对索引的重复性的判断不能单单看是否相等,应该要看两个值得差值是否小于内容的长度,如果小于内容的长度,那么这两个索引还是重复的,应该保留较小值,删除较大值。索引归并后就得到了最后的结果。这个结果将用于最后的抽取的数据源。3.5 各个字段的抽取方法3.5.1 共通性特征具体的抽取都放在不同的类里面,这些类具有相同的基类EntitySet(EMailSet除外),所有的类都放在Extraction包里面。以下是Extraction包的类列表:NameSet、PositionSet、EMailSet、TelephoneSet、AddressSet、UnitSet、SubjectSet、ItemSet、TechnologySet。这样设计是因为他们都有共通性的特征。所有继承EntitySet的类的构造函数都调用EntitySet的构造函数,而且使用了不同的规则文件。这样使得整个系统显得更加体系化。规则文件的路径在RUN_TIME.RUN_TIME里面作为静态属性设定。EntitySet的构造函数如下:public EntitySet(LinkedList parseResult, String rule_file_name, boolean exact)第一个参数是Parser的Parse结果,第二个是规则文件的名称,第三个是合并器的合并方法设定。在EntitySet中需要保留parseResult作为以后使用,规则文件是用来构造LinkMatcher的实例matcher的,有了matcher和exact就可以对parseResult进行操作了。将parseResult作为matcher的getMatch参数,可以得到一个matcherResult;再将matcherResult和exact作为Merger的函数Merge的参数,得到了中间结果entitylist。entitylist是EntitySet的一个域,EntitySet还有一个parseResult的引用parserResult以及一个特征链表characteristicIndex。characteristicIndex是通过筛选entitylist的0权值项获得的。在规则中,设置权值为0的项属于特征词,比如“姓名”就是一个特征词。特征词不是最后抽取所需要的,但是特征词可以在抽取过程中起到重要作用!特征词链表characteristicIndex通过过滤entitylist,将权值为0的项移动到自身获得。整个构造函数就是初始化了这几个链表:parserResult、entitylist、characteristicIndex。每一个命名实体在页面中都具有索引、权重,而且还有共通的特征,可以归纳如下:该类型第一个出现的实体;权值最高的实体;距离特征词最近的实体。虽然不同类型的命名实体具有不同的特征,有不同的抽取方法,但是以上提到的三种特征对每一种实体都具有一定的意义,所以在基类中予以实现。三种特征的抽取分别是三个函数,返回值类型都是Merger.Entity。● protected Entity getFirstEntity() 获得第一个出现的实体首先设置index到一个足够大的值,在本系统中设置为65535。然后遍历entitylist,对entitylist里面的每一个元素的indexs进行遍历,当遇到比index小的元素就代替index,并设置结果实体result为entitylist的当前元素。直到遍历结束,返回result字符串。● protected Entity getWeightestEntity() 获得权值最高的实体首先设置weight为零。然后遍历entitylist,对entitylist里面的每一个元素的weight,如果比weight大,就替换之,并且设置结果实体result为entitylist的当前元素。直到遍历结束,返回result。● protected Entity getNearestEntity() 获得最接近特征词的实体该过程是一个三重循环,第一重是对entitylist遍历,第二重是对当前的entitylist元素的indexs遍历,第三重是对characteristicIndex的遍历,比较characteristicIndex的元素的索引跟indexs的元素值,找出最小的差距,返回差距最小的实体。3.5.2 姓名的抽取抽取姓名所用到的规则保存在name.extr.rule里面,并且归并方式为非精确归并。姓名的抽取算法如下:① 找出最接近特征词的实体nearest和权值最高的实体weightest;② 如果nearest跟weightest内容一样,返回实体的内容;③ 找出第一个实体first以及其所以firstIndex;④ 如果firstIndex<2,即出现在HTML头部,返回first的内容;⑤ 如果nearest跟first内容一样,就返回他们的内容;⑥ 最后,如果weightest的权值高于200则返回weightest的内容;⑦ 返回空。3.5.3 职称的抽取抽取职称所用到的规则保存在pos.extr.rule里面,归并方式为精确归并。抽取算法如下:① 找出最接近特征词的实体nearest,如果存在则返回;② 找出权值最高的实体weightest,如果存在则返回;③ 返回空。对职称并没有姓名那样过多的要求,因为职称相对姓名来说非常简单,数量非常少,而且不像姓名那样千奇百怪。因此就简单得抽取,当然最佳抽取结果还是找到“职称”、“职务”等字段,再查找最接近的匹配字。找不到的再找一个出现概率最高的取代理论正确性也很高。3.5.4 电子邮件的抽取电子邮件的抽取是不需要通过以上提到的匹配之类的,只需要下载到的源文本。所以电子邮件抽取对应的类EMailSet不是从EntitySet继承过来的。对源文本匹配所有的电子邮件格式的字符串,将所有的符合的字符串用、(顿号)分开串成一个新的字符串返回。电子邮件的抽取相对是很简单的,因为电子邮件的格式是恒定的,所用的字符集小。抽取电子邮件用到了正则表达式:[a-zA-Z_0-9\-]+@([a-zA-Z_0-9\-]+\.)+[a-zA-Z]+。3.5.5 电话的抽取抽取电话所用到的规则保存在tel.extr.rule里面,归并的方式为非精确归并。抽取算法如下:① 找出最接近特征词的实体nearest;② 如果nearest符合电话格式就返回nearest的内容;③ 找出内容最长的实体longest;④ 如果longest符合电话格式就返回longest的内容;⑤ 找出权值最高的实体weightest;⑥ 如果weightest符合电话格式就返回weightest的内容;⑦ 返回空。电话格式通常都是3到4位数字,然后一个“-”,然后6位或以上数字;也有只有后者即6位以上数字的。如果不出现正常情况的话,通常一个页面具有电话号就是该页面的最长数字串。3.5.6 联系地址的抽取抽取地址所用到的规则保存在addr.extr.rule里面,归并方式为非精确归并。抽取算法如下:① 找出特征词的索引,如果不存在特征词则返回空;② 取出特征词的索引的下一位所在的链(见Parser.getTagSting);③ 如果该链含有“地址”子串,将其去除;④ 返回链字符串。对地址的抽取仅能用这种方法,因为地址的电话非常大。地址的前部都是省份城市变化相对小,但是后部变化就太大了。加上,如果一个页面里面没有特征词的话,一般是没有地址的。3.5.7 工作单位的抽取抽取工作单位的规则保存在unit.extr.rule里面,归并方式为非精确归并。抽取算法如下:① 分别找出三个特征性的实体nearest、weightest、first;② 如果nearest的内容跟weightest的内容一样,返回该内容;③ 如果nearest的内容跟first的内容一样,返回该内容;④ 如果nearest的权值大于200,返回nearest的内容;⑤ 如果first的内容跟weightest的内容一样,返回该内容;⑥ 如果first的权值大于400,返回first的内容;⑦ 如果weightest的权值大于400,返回weightest的内容;⑧ 取出特征词的索引,如果没有返回空;⑨ 取出特征词的索引的下一位所在的链(见Parser.getTagSting);⑩ 如果该链含有“单位”子串,将其去除;? 返回链字符串。3.5.8 所属学科的抽取抽取工作单位的规则保存在subj.extr.rule里面,归并方式为非精确归并。抽取算法如下:① 分别找出三个特征性的实体nearest、weightest、first;② 如果nearest的内容跟weightest的内容一样,返回该内容;③ 如果nearest的内容跟first的内容一样,返回该内容;④ 如果nearest的权值大于200,返回nearest的内容;⑤ 如果first的内容跟weightest的内容一样,返回该内容;⑥ 如果first的权值大于400,返回first的内容;⑦ 如果weightest的权值大于400,返回weightest的内容;⑧ 取出特征词的索引,如果没有返回空;⑨ 取出特征词的索引的下一位所在的链(见Parser.getTagSting);⑩ 如果该链含有“学科”子串,将其去除;? 返回链字符串。3.5.9 参与项目的抽取① 找出特征词的索引,如果不存在特征词则返回空;② 取出特征词的索引的下一位所在的链(见Parser.getTagSting);③ 如果该链含有“项目”子串,将其去除;④ 返回链字符串。3.5.10 研究方向的抽取由于研究方向的规则定义的绝对性,只要是匹配到的实体都可以确定为目标,所以将所有匹配结果用、(顿号)隔开串成字符串返回。4. 运行结果及分析4.1 系统运行的结果4.1.1 稳定性测试本系统使用了线程,线程间的通讯没有专门设计,因此可能存在稳定性问题;另外因为使用了外部的dll程序,dll程序的不稳定性也是存在的。(1) 线程稳定性经过初步的测试,没有发现线程同步问题。在Get_List工作的时候开启Filter_List,后者对Get_List的结果读取并没有问题。IE的运作相对独立,不会受其他线程的影响。经过分析,其稳定性是建立在java对线程的稳定性的基础上的。因为Vector类具有线程同步,所以数据并没有出现错误或者错位。两个线程只共享了Vector的实例,并没有其他数据,因此系统是稳定的。(2) ICTCLAS稳定性本系统使用了ICTCLAS,在多次运行中,出现过ICTCLAS出错的问题,而且全部都是dll运行时的内存问题。在官方网站中并没有ICTCLAS的dll库下载,只能下载到具有可视化界面的源程序。因此自能修改成java可以调用的dll库。修改dll的经验的不足带来了一系列的问题,主要是稳定性问题(在正确性上面做到跟ICTCLAS演示程序一样)。ICTCLAS的不稳定使得本系统具有不稳定性,只要ICTCLAS出错整个系统就无法运行了。4.1.2 正确性测试正确性测试分成两种:一是对含有数据的网页的抽取的正确性;二是对不含有数据的网页的抽取的错误判断。各个字段的抽取的正确性是不同的。以下是对14个已知NLP个人主页(从凌江处获得的结果)的抽取的正确性测试结果表:字段 正确数据的争取抽取 错误数据的错误抽取姓名 10 0职称 13 0个人主页 14 0电子邮箱 14 0电话 3 0联系地址 0 0所属单位 12 2所属学科 12 1参与项目 0 0研究方向 10 0总 结 62.9% 2.1%从结果中可以看出,为了提高准确性,避免抽取出错误的信息,使得一部分正确信息不能被正确抽取出来。4.2 有关问题总结和系统的改进建议4.2.1 分词系统的更换现在国内已经有不少词语切分的成品,甚至作为商品出售。当初选择ICTCLAS是因为它是免费而且开放源代码,可以根据源代码修改成为一个更稳定的系统。但是中科院的词语切分系统在正确性上面不如北大的。在系统开发的前期,dll库还没有修改完成,当时使用ICTCLAS是使用其官方网站上面的演示页面。不停的调用远程的页面分词的话,一个很严重的问题就是时间耗费太大。但是使用本地程序就不可能使用远程程序一样有着不同的更新版本,正确性不可能不断的提高。分词系统的正确性直接影响着姓名的抽取,当规则中没有一个姓名的绝对匹配的话,姓名的抽取完全靠分词系统了。因此,对分词系统的更换提出如下建议:更换一个正确性更高的本地词语切分系统,比如山西大学的词语切分系统就是一个不错的选择。山西大学的词语切分系统是购买了ICTCLAS并且对其进行了优化,即将有对应的java版本的成品,是一个不错的选择。另一个正确性很高的词语切分系统是北京大学的,但是没有提供本地程序,只能远程页面调用,时间耗费太大。如果北京大学提供相应的本地化程序供使用的确是一个更好的选择。4.2.2 索引的绝对化本系统中索引并不是绝对的,而是按照分词结果进行重分配的,在后期某些地方可能会带来一定的问题。而且这样定义索引不够客观,会随着词语切分系统的更新而变化。因此,建议索引采用绝对索引,即以整个匹配结果的第一个字在文本中的绝对位置作为索引值。4.2.3 权值的重分配在以上测试中已经看到规则中权值的不合理给抽取结果带来了很多错误,主要是不应该抽取的数据会被错误的抽取出来。权值在本系统中采用了整型值,而不是介于0-1的浮点数。将当前的权值重新设计安排在0-1之间的浮点数就显得比较客观。但是如何取值仍然需要大量的实验去证明。因此,除了建议权值归1化之外,还建议通过大量实验对权值重新分配。4.2.4 抽取算法的优化除了姓名、职称、个人主页、电子邮件、电话和研究方向以外的其他字段(联系地址、工作单位、所属学科、参与项目)的抽取,都存在着正确性问题,究其原因是因为这些字段变化太大(特别是参与项目),界限难以抓取。系统采用两级链表的设计是为了解决此类问题的。通常一个实体在页面内都汇报存在一个单一的标记内部,并不会夸两个标记保存。因此,建议采用一种特征性的抽取方法(该方法在早期中曾经设计过,但由于时间原因并没有实现)。在规则中加入一些象征性的词语,比如项目中可以加入“963计划”等象征性词语。对最后产生的entitylist,找出这些象征性的词语所在的链(即单独一个标记的内部)。对链进行边界确定后返回。这种方法对疑难字段的抽取应该说是相当有用的。5. 参考文献[1] 朱晓明《计算语言学虚拟信息中心网站的设计与实现》2003[2] 骆卫华《信息提取(IE)概述》2002[3] 李保利,陈玉忠,俞士汶《信息抽取研究综述》2003[4] Hobbs J, The Generic Information Extraction System. In Proceedings of the Fifth Message Understanding Conference (MUC-5), pages 87-91. Morgan Kaufman, 1993[5] 李旻庆[6] 王晨[7] ICTCLAS[8] 俞士汶《计算语言学简介》6. 致谢最后,我要深深感谢我的导师和身边的同学,在我毕业设计和撰写论文的过程中,他们给了我无微不至的关怀和爱护,在我向前迈出的每一小步中都有他们的辛勤和汗水,“不积小步,无以成千里”,正是在这种爱的关爱下,在李芳老师和诸位同学默默关注的目光和永远鉴定的支持下,我得以顺利的完成此篇本科生毕业论文。他们始终都是我的坚强后盾,是他们的支持和鼓励使我不畏艰辛,勇往直前。“谁言寸草心,报得三春晖”,我也要将这篇论文献给他们,感谢他们无私的爱。他们是我的信心来源,他们的支持和鼓励使我不畏艰辛,勇往直前。所以,我要将这篇论文献给他们,感谢他们为我做的一切,感谢他们无私的爱。7. 附录7.1 ICTCLAS词性标记集规范代码 名称 帮助记忆的诠释Ag 形语素 形容词性语素。形容词代码为a,语素代码g前面置以A。 a 形容词 取英语形容词adjective的第1个字母。 ad 副形词 直接作状语的形容词。 an 名形词 具有名词功能的形容词。 b 区别词 取汉字“别”的声母。 c 连词 取英语连词conjunction的第1个字母。 Dg 副语素 副词性语素。副词代码为d,语素代码g前面置以D。 d 副词 取adverb的第2个字母,因其第1个字母已用于形容词。 e 叹词 取英语叹词exclamation的第1个字母。 f 方位词 取汉字“方” g 语素 取汉字“根”的声母。 h 前接成分 取英语head的第1个字母。 i 成语 取英语成语idiom的第1个字母。 j 简称略语 取汉字“简”的声母。 k 后接成分 l 习用语 习用语尚未成为成语,取“临”的声母。 m 数词 取英语numeral的第3个字母,n,u已有他用。 Ng 名语素 名词性语素。名词代码为n,语素代码g前面置以N。 n 名词 取英语名词noun的第1个字母。 nr 人名 名词代码n和“人(ren)”的声母并在一起。 ns 地名 名词代码n和处所词代码s并在一起。 nt 机构团体 “团”的声母为t,名词代码n和t并在一起。 nz 其他专名 名词代码n和z并在一起。 o 拟声词 取英语拟声词onomatopoeia的第1个字母。 p 介词 取英语介词prepositional的第1个字母。 q 量词 取英语quantity的第1个字母。 r 代词 取英语代词pronoun的第2个字母,因p已用于介词。 s 处所词 取英语space的第1个字母。 Tg 时语素 时间词性语素。在语素的代码g前面置以T。 t 时间词 取英语time的第1个字母。 u 助词 取英语助词auxiliary Vg 动语素 动词性语素。动词代码为v。在语素的代码g前面置以V。 v 动词 取英语动词verb的第一个字母。 vd 副动词 直接作状语的动词。动词和副词的代码并在一起。 vn 名动词 指具有名词功能的动词。动词和名词的代码并在一起。 w 标点符号 x 非语素字 字母x通常用于代表未知数、符号。 y 语气词 取汉字“语”的声母。 z 状态词 取汉字“状”的声母的前一个字母。 7.2 系统使用帮助※ 修改:·Dillon 於 06月08日16:59:43 修改本文·[FROM: 211.80.51.111]※ 来源:·饮水思源 bbs.sjtu.edu.cn·[FROM: 211.80.51.111]
本主题共有 1 篇文章.
[回文章] [返回上一页][本讨论区]