java - 加快 Java 版 WordNet 词形还原器的使用速度

标签 java performance optimization wordnet

另一个问题与这个问题类似,但它使用不同的编程语言,并且似乎解决了一个相关但不相同的问题。 Is it possible to speed up Wordnet Lemmatizer?

我们在文本中对大量单词进行词干分析,如图所示,代码中 90% 以上的时间都花在词干分析上。

profiling the analysis process

当我们稍微阅读一下代码并分析代码时,似乎 wordNet 在执行时实际上正在从文件中读取数据,这占用了大部分代码执行时间!有没有一种方法可以提高性能,例如使用数据库而不是文件读取来支持词干处理过程的数据,或者加载内存所需的所有内容并忽略文件?或者在词干提取过程中添加一些缓存?

是否有一些易于插入的工具来代替行读取?

在此处查看读取分析的行:

enter image description here

如您所见,文件读取摘要占用了运行时间的 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/

相关文章:

java - 无法在浏览器上将 Spring Boot XSRF-TOKEN 标志设置为安全

c# - 内存型号 : preventing store-release and load-acquire reordering

c++ - 优化 YUY2 到 I420 的转换

javascript - 调整 Phonegap 的应用程序执行性能

java - 从当前位置排序经纬度坐标

java - 没有内部类的 Json Jackson 反序列化

java - 避免将 Jackson xmlMapper 用作 Spring 的默认 objectMapper

c# - 在 c# asp.net 中,静态类比非静态类更有效吗?

performance - 在命令窗口中使用编辑器时 Matlab 性能奇怪

c - 避免使用货币进行浮点运算