Colorfulword——WordNet浏览器作业报告-GoogleCode.docx_第1页
Colorfulword——WordNet浏览器作业报告-GoogleCode.docx_第2页
Colorfulword——WordNet浏览器作业报告-GoogleCode.docx_第3页
Colorfulword——WordNet浏览器作业报告-GoogleCode.docx_第4页
Colorfulword——WordNet浏览器作业报告-GoogleCode.docx_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ColorfulwordWordNet浏览器作业报告成员及贡献刘智猷(队长) 00948 张泰之 00948 徐源盛 00948 安传恺 00948180 负责底层架构,完成wndata包. 主要工作在DataManager.java中,代码约500行;修改补全开源文件的相关函数约300行.需求分析 WordNet词典是目前世界上影响最大的词汇语义知识库,在自然语言处理、信息检索等领域有广泛应用.WordNet自带的浏览器相对简陋,无法充分直观展示WordNet词典中蕴含的词汇间复杂的关系。因此,我们需要一个操作更为简便,继承原有浏览器功能并拓展新功能的,界面美观,人性化,词条检索准确,词组之间关系可视化的浏览器.这样不仅满足普通查询的需求,还可以作为计算语言学研究的优秀辅助工具.总体设计在总体设计上如下图所示。虽然WordNet将其数据库设计为文本而不是二进制数据,虽然使得数据库文件具有了一定的可读性,但是也给程序的处理造成了一些不必要的麻烦。为了将数据库的每一行字符表示成一个程序中的逻辑实体,尽可能地减少读取文件,操作文本的编程工作,我们设立了最底层的DataMnager,负责给上层提供一个关于数据库的抽象层,使得上层功能可以将数据库中的每个条目看成一个实体而不是一个字符串。在这一基础上,Browser类实现了本项目作为一个词典的基本功能。作为主窗口,其任务就是将监听到的响应的用户请求分派给合适的对象,并将对象的结果处理成用户友好的形式显示。例如,当用户在查词框键入按键时,将当前的前缀分发给Class Trie对应的实例,并将其返回的结果添加到待选提示框内。另一个例子是当用户查词时,该类使用DataManager 中的lookup方法,得到单词所在的所有Synset,再将这些Synset转换成可以理解的文本显示。项目的另一部分与Synset的颜色有关。我们设计了一个基于人机交互的Synset染色算法。通过这个算法,希望可以给每个Synset染上一个“符合”其含义的颜色。这里的“符合”要打上双引号是因为这一说法并没有一个完美的标准。在染色的基础上,我们设计了GraphExplorer作为查看以Synset之间的关系为边,以Synset为顶点的经过染色的图的查看器。需要说明的是,在设计和考察WordNet浏览器时,Rochester大学开发的,GPLv3开源协议下发布的URCSWordNet浏览器(/research/cisd/wordnet/)对设计者提供了很大的帮助,在此表示感谢。本项目中有一些文件直接来自于上述项目,我们会在介绍具体实现时逐一指出。具体实现wndata包这个包中的需要文件既DataManager.java.其余文件均是对WordNet数据库中某个实体的结构化对应。这一对应很多时候是机械的,为此,我们直接选用了上面提到的URCSWordNet浏览器中的代码。但是为了适应本程序独特的数据结构,我们独创了读入和处理数据的方法,集中体现在DataManager.java中,引用其余文件仅仅是为了避免重复劳动,借用其代码表示Synset,SynsetFrame,SynsetPointer,PartofSpeech,IndexEntry,等必备的类的属性.而且我们添加或改写了对应的构造函数,equals函数,返回属性值的函数,保留了原开源程序结构清晰,面向对象性强的优点,又发现和解决了原来开源程序读取文件中存在的bug.有一点需要提及的是,由于编码差异,本包文件中的注释可能无法正常显示。以下是每个文件的详细说明WordSense.java: 记录单词和lex_id,较开源程序对于部分形容词我们还添加了放置位置的属性,修改了构造函数.WordNetReader.java: 开源程序的读取,本程序没有使用.WordNetFileReader.java :开源程序的读取,本程序没有使用SynsetPointer.java: 记录data文件中表示不同synset之间关系的四元元素组,较开源程序改写了构造函数,添加了返回各个属性的函数SynsetFrame.java : 保存动词的f_num和w_num属性(详见说明文档),较开源程序添加了构造函数.Synset.java: Synset是处理单词的基本单位,本类保存了与之相关的rotected int offset;(在data文件中的位置) protected int lex_filenum; protected PartOfSpeech ss_type;(词性) protected int w_cnt;(synset中的单词数) protected WordSense words;(Synset中的单词) protected int lex_id; protected int p_cnt;(关系数目) protected SynsetPointer ptrs;(表示关系的四元组集合) protected SynsetFrame frames;(动词特有)protected String glosses;(解释)等基本属性,是本程序的重要单元.较开源程序添加了构造函数.Printing.java :开源程序的输出部分,未使用PointerSymbol.java 枚举类,描绘不同synset之间的关系,程序因此简洁,因枚举类的构建为重复机械劳动,故而引用.PartofSpeech.java 枚举类,描述不同词性,n,v,adj,adv, satellite的形容词,因枚举类的构建为重复机械劳动,故而引用.IndexEntry.java 保存扫描索引文件之后的处理结果. protected String lemma; /详见说明文档 protected PartOfSpeech pos; protected int synset_cnt; protected int p_cnt; protected String ptr_symbols; protected int sense_cnt; protected int tagsense_cnt;protected int synset_offsets;/该单词在data文件中的位置,重要 添加了构造函数和返回属性的函数.DataManager.java这是本程序的初始部分,主要负责读入并整理数据,建立底层架构. 主要函数和结构:采用单例类,保证只读取一次index文件,提高运行速度.定义Map作为主要的数据结构,记录不同数据间的关系.定义Trie树便于今后的搜索,在静态初始化块中完成了对处理Synset的缓存的初始化,打开4个index文件逐行扫描,进行单词的切分,把单词和单词所在行作为一个映射关系存入Map中,读取存放不同synset颜色情况的文件并建立了Synset的offset到颜色的Map,是实现单词染色的基础,使用RandomAccessFile读取文件,并注意可能的异常.初始化块外有以下函数:public IndexEntry getIndex(String word,PartOfSpeech pos)传入一个String型的单词和词性,返回一个单词在其索引文件中的行生成的IndexEntry对象.主要过程是对一行组成的字符串进行单词切分,取出相应的部分调用构造函数建立IndexEntry对象并返回.public Synset getSynset(int offset,PartOfSpeech pos) 传入该单词在索引文件中的偏移量和词性,返回所在的Synset(同义词集合)采用缓存机制加快程序运行速度,如果要打开的Synset已经存放在Synset缓存中,则返回相应的缓存单元.否则使用RandomAccess定位,用split方法切分该行单词,调用Synset的构造函数生成Synset对象,放入缓存并返回.值得注意的是部分形容词具有后缀的(a)或(p),本程序将这个属性定义为way_put,已经拆分;而且verb具有独特的frame属性,需要加以区分.切分单词的过程中要注意数据类型的转换,尤其是一些细微的十六进制数,合理调用Inter.parseInt,枚举类的forString等函数.public Synset lookup(String word, PartOfSpeech pos)传入一个单词和相应的词性,返回这个单词所在的所有Synset.本函数是getIndexEntry() 和getSynset() 的结合,简化了查询行为。先调用getIndexEntry获得offset集合,再依次用offset和pos生成Synset,放在数组中返回.public boolean setColor(Synset synset, Colors colors)传入synset ,用colors的属性为Synset赋值,涉及color_map和colors.javaSynset类中有hashcode方法,可以调出color_map的键值对public Colors getColor(Synset synset) 获取synset的color情况,保存在Colors型对象中public void writeColor() 将当前color_map中保存的hash_code和代表颜色情况的char输出到文件中.public static Trie getTrie()返回trie树package browser这个包中的主要部分就是总体设计中提到的class Browser。Browser继承与JFrame类,提供本项目的主窗体。在主窗体上使用JComboBox作为带输入提示的单词查询输入框,使用JTextPane的Html模式显示搜索得到的synset。当然,为了将结构化的synset变成适合显示的html,也需要一步转换的过程。这一过程封装在HtmlPraser内部类里。窗体上还有一对前进后退按钮。这几个功能中最简单的是前进后退。实现这个功能只要声明一个LinkedList将历史记录都保存到这个List中,前进后退时将Interator相应地移动得到对应的查询单词,再次提交查询即可。由于底层管理器实现了缓存机制,这一过程往往不需要重新读取data文件,效率较好。在查询单词并将结果转换成对应的Html时,由于需要读取data文件,还有转换成Html,所用时间有可能很长。为了确保程序不会假死太久,我们利用Swing提供的SwingWorker类进行多线程编程。SwingWorker是Swing提供的多线程编程封装。使用SwingWorker是,需要实现的方法有三个。一个是该类的构造函数,构造函数可以接受创建者提供的参数,这就类似于线程编程中的原型方法,主线程可以通过原型方法的参数给副线程传递数据。但是,由于SwingWorker是一个类,它还可以有属于自己的私有成员,这就类似于线程编程中原型方法的局部变量或者是只有该线程自己使用的全局变量。在完成初始化后,通过在主线程中调用execute方法,SwingWorker就会在一个新线程上运行doInBackground()方法。SwingWorker的另一个线程在执行doInBackground方法是也是有办法和主线程交互的,不过我们需要用到的只有SwingWorker类的cancel方法。这个方法可以由SwingWorker线程之外的线程调用,SwingWorker将在工作的间隙查看自己是否被cancel了,如果是的话,会该线程会退出,整个程序的时间分发线程将会执行SwingWorker的done方法,在该方法中isCancel会返回真。如果doInBackground执行完成,done方法也将由时间分发线程执行,不过isCancle将返回假。如果也就是说,done方法不是由SwingWorker线程执行的,不过,由于作用域规则,执行done方法的作用域线程仍然可以访问SwingWorker的私有变量。而且,doInBackground可以返回一个对象,事件分发线程可以在done方法中调用get()方法得到doInBackground中返回的对象。这其实相当于副线程将其结果放在和主线程约定好的堆上某处。通过这种机制,我们可以将查询用户输入单词所在的所有Synset和将Synset构造为相应的Html内容,都可以放到一个SwingWorker的doInBackground中完成。这些事件完成后,再在事件分发线程上改变控件的属性。另外,由于SwingWorker支持cancel方法,如果在后台线程查询过程中,用户提交了新的请求,只要将原线程取消,再建立新的线程即可。这样,即保持了用户界面的高响应度,也保证了线程安全。不仅用户查询单词使用了这一技术,在使用Trie树查询匹配前缀的单词的时候,也使用了这一技术。程序亮点由于提供了前进后退,选词查询等功能,整个程序在访问Synset时会体现出很强的工作集局部性。针对这一特点,我们在DataManager中使用缓存机制保存最近读取的Synset而不是在初始化时将所有的Synset读进内存,既节约了内存又不会对性能造成很大的影响。在class Browser中,将耗时任务安排在SwingWorker创建的线程上,保证程序对用户的响应。同时重载其Editor使一个JComboBox作为带输入提示的文本框,改善了用户体验。同时,由于使用了设计精巧的Trie结构,使得用户可以输入带*,?通配符的查询前缀,而且保证了响应速度。 使用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论