加快WordNet lemmatizer for Java的使用
另一个问题与此类似,但它是在不同的编程语言中,它似乎解决了一个相关但不相同的问题 我们对文本中的大量单词进行词干分析,代码花费了90%以上的时间进行词干分析,如图所示 当我们稍微阅读代码并分析代码时,wordNet似乎实际上是在读取文件,而这占用了大部分代码执行时间!有没有一种方法可以提高性能,比如说,使用数据库而不是文件读取来支持词干分析过程的数据,或者加载内存所需的所有内容并忽略文件?或者在词干生成过程中添加一些缓存 是否有一些工具可以很容易地插入以取代行读数 请参见此处的行读取配置文件:加快WordNet lemmatizer for Java的使用,java,performance,optimization,wordnet,Java,Performance,Optimization,Wordnet,另一个问题与此类似,但它是在不同的编程语言中,它似乎解决了一个相关但不相同的问题 我们对文本中的大量单词进行词干分析,代码花费了90%以上的时间进行词干分析,如图所示 当我们稍微阅读代码并分析代码时,wordNet似乎实际上是在读取文件,而这占用了大部分代码执行时间!有没有一种方法可以提高性能,比如说,使用数据库而不是文件读取来支持词干分析过程的数据,或者加载内存所需的所有内容并忽略文件?或者在词干生成过程中添加一些缓存 是否有一些工具可以很容易地插入以取代行读数 请参见此处的行读取配置文件:
正如您所看到的,概要文件读取占运行时间的62%。可以使用MapBackedDictionary或DatabaseBackedDictionary代替FileBackedDictionary 我描述了我是如何成功地使用MapBackedDictionary运行的 需要使用jwnl实用程序。如果您打开WordNet项目,您可以使用其类DictionaryToMap.java main方法将现有的DICITORY文件夹转换为map fodler 之后,您可以创建一个map_properties.xml文件,该文件类似于您先前用于FileBackedDictionary的文件_properties.xml。这次标签会有点不同。我在这里发布了我的示例xml,它对我来说运行良好
<?xml version="1.0" encoding="UTF-8"?>
<jwnl_properties language="en">
<version publisher="Princeton" number="3.0" language="en"/>
<dictionary class="net.didion.jwnl.dictionary.MapBackedDictionary">
<param name="morphological_processor" value="net.didion.jwnl.dictionary.morph.DefaultMorphologicalProcessor">
<param name="operations">
<param value="net.didion.jwnl.dictionary.morph.LookupExceptionsOperation"/>
<param value="net.didion.jwnl.dictionary.morph.DetachSuffixesOperation">
<param name="noun" value="|s=|ses=s|xes=x|zes=z|ches=ch|shes=sh|men=man|ies=y|"/>
<param name="verb" value="|s=|ies=y|es=e|es=|ed=e|ed=|ing=e|ing=|"/>
<param name="adjective" value="|er=|est=|er=e|est=e|"/>
<param name="operations">
<param value="net.didion.jwnl.dictionary.morph.LookupIndexWordOperation"/>
<param value="net.didion.jwnl.dictionary.morph.LookupExceptionsOperation"/>
</param>
</param>
<param value="net.didion.jwnl.dictionary.morph.TokenizerOperation">
<param name="delimiters">
<param value=" "/>
<param value="-"/>
</param>
<param name="token_operations">
<param value="net.didion.jwnl.dictionary.morph.LookupIndexWordOperation"/>
<param value="net.didion.jwnl.dictionary.morph.LookupExceptionsOperation"/>
<param value="net.didion.jwnl.dictionary.morph.DetachSuffixesOperation">
<param name="noun" value="|s=|ses=s|xes=x|zes=z|ches=ch|shes=sh|men=man|ies=y|"/>
<param name="verb" value="|s=|ies=y|es=e|es=|ed=e|ed=|ing=e|ing=|"/>
<param name="adjective" value="|er=|est=|er=e|est=e|"/>
<param name="operations">
<param value="net.didion.jwnl.dictionary.morph.LookupIndexWordOperation"/>
<param value="net.didion.jwnl.dictionary.morph.LookupExceptionsOperation"/>
</param>
</param>
</param>
</param>
</param>
</param>
<param name="dictionary_element_factory" value="net.didion.jwnl.data.MapBackedDictionaryElementFactory"/>
<param name="file_type" value="net.didion.jwnl.princeton.file.PrincetonObjectDictionaryFile"/>
<param name="dictionary_path" value="path\to\wordnetMap\"/>
</dictionary>
<resource class="PrincetonResource"/>
</jwnl_properties>
注意wordnetMap的路径-将其设置为使用前面提到的方法输出字典转换的位置
不要忘记用新的属性文件初始化JWNL。
MapBackedDictionary最初加载需要更长的时间,但性能提升非常快。您不能将文件放入RAM中吗,例如Linux上的
/dev/shm
?档案有多大?如果你有足够的内存,操作系统应该自动缓存它。它只有大约36Mbs。甚至这个类也被称为PrincetonRandomAccessDictionaryFile——这意味着他们很可能是从内存中读取的。然而,这是缓慢的。有一种想法认为获取文件需要很长时间。那么,它的工作方式可以做些什么呢?或者reaad()和readLine()花费这么长时间是正常的吗?我不知道有什么方法可以确定他们是否在有效地进行读取。可能有多个实现,所以您只需要选择一个基于内存的实现。谢谢!现在我看到了MapBackedDictionary和DatabaseBackedDictionary的替代方案。我现在要搜索如何使用这些,这看起来像是一个非常糟糕的XML混乱。我真的想知道为什么他们破坏了可用性而不是简单地预取文件(如果需要任何XML,它应该保持不变)。无论如何,我自己只是从extJwnl库复制了一些xml,因为我几乎找不到关于如何设置xml配置的文档。找到需要修改的内容并进行修改。如果有一些文档的话,我认为xml文件没有问题,但这也让我很恼火。