另一个问题与这个问题类似,但它使用不同的编程语言,并且似乎解决了一个相关但不相同的问题。 Is it possible to speed up Wordnet Lemmatizer?
我们在文本中对大量单词进行词干分析,如图所示,代码中 90% 以上的时间都花在词干分析上。
当我们稍微阅读一下代码并分析代码时,似乎 wordNet 在执行时实际上正在从文件中读取数据,这占用了大部分代码执行时间!有没有一种方法可以提高性能,例如使用数据库而不是文件读取来支持词干处理过程的数据,或者加载内存所需的所有内容并忽略文件?或者在词干提取过程中添加一些缓存?
是否有一些易于插入的工具来代替行读取?
在此处查看读取分析的行:
如您所见,文件读取摘要占用了运行时间的 62%。
最佳答案
可以使用 MapBackedDictionary 或 DatabaseBackedDictionary 来代替 FileBackedDictionary。
我描述了我如何成功地使用 MapBackedDictionary 运行。
需要使用 jwnl 实用程序。如果你打开WordNet项目,你可以使用他们的类DictionaryToMap.java main方法将现有的词典文件夹转换为 map 文件夹。
之后,您可以创建一个与之前为 FileBackedDictionary 使用的 file_properties.xml 类似的 map_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 最初加载需要更长的时间,但性能提升是极大的。
关于java - 加快 Java 版 WordNet 词形还原器的使用速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24903901/