另一个问题与此类似,但它采用不同的编程语言,似乎解决了一个相关但不一样的问题。 Is it possible to speed up Wordnet Lemmatizer?
我们在文本中扼杀了大量的单词,代码花费了90%以上,只是在图片中可以看到。
当我们仔细阅读代码并对代码进行分析时,似乎wordNet实际上是在从文件中读取时占用了大部分代码执行时间!有没有办法通过使用数据库而不是文件读取来提高性能,以支持阻塞过程的数据或加载内存所需的所有内容并忽略文件?或者为词干过程添加一些缓存?
是否有一些工具可以轻松插入以替换行读取?
请参阅此处的行阅读分析:
如您所见,摘要中的文件读取时间最多占运行时间的62%。
答案 0 :(得分:1)
可以使用MapBackedDictionary或DatabaseBackedDictionary而不是FileBackedDictionary。
我描述了我如何成功运行MapBackedDictionary。
需要使用jwnl实用程序。如果您打开WordNet项目,您可以使用他们的类DictionaryToMap.java主方法将您现有的dicitonary文件夹转换为地图fodler。
之后,您可以创建一个类似于之前用于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最初需要更长时间才能加载,但性能提升是极端的。