【问题标题】:Weka and Snowball don't work when exported in JAR在 JAR 中导出时,Weka 和 Snowball 不起作用
【发布时间】:2013-06-18 18:12:26
【问题描述】:

这个问题真让我抓狂,

回答大多数人的想法:是的,我将 snowball.jar 添加到 CLASSPATH 中

我有一个简单的主类,应该将“going”这个词改为“go”:

import weka.core.stemmers.SnowballStemmer;

public class StemmerTest {
    public static void main(String[] args) {
        SnowballStemmer stemmer = new SnowballStemmer();
        stemmer.setStemmer("english");
        System.out.println(stemmer.stem("going"));
    }
}

首先当我在 Eclipse 中运行它时,它可以工作,我得到以下输出:

Refreshing GOE props...
---Registering Weka Editors---
Trying to add database driver (JDBC): RmiJdbc.RJDriver - Warning, not in CLASSPATH?
Trying to add database driver (JDBC): jdbc.idbDriver - Warning, not in CLASSPATH?
Trying to add database driver (JDBC): org.gjt.mm.mysql.Driver - Warning, not in CLASSPATH?
Trying to add database driver (JDBC): com.mckoi.JDBCDriver - Warning, not in CLASSPATH?
Trying to add database driver (JDBC): org.hsqldb.jdbcDriver - Warning, not in CLASSPATH?
[KnowledgeFlow] Loading properties and plugins...
[KnowledgeFlow] Initializing KF...
go

但是当我将它作为可运行的 jar 从 eclipse“stem.jar”导出并在终端“java -jar stem.jar”中执行时,它不起作用,我得到以下信息输出:

Refreshing GOE props...
[KnowledgeFlow] Loading properties and plugins...
[KnowledgeFlow] Initializing KF...
Stemmer 'porter' unknown!
Stemmer 'english' unknown!
going

我不知道为什么在导出的 jar 中无法识别 snowball.jar ... 虽然 weka.jar 和 snowball.jar 都包含在导出的 jar 中。下面是 stem.jar 文件结构:

stem.jar
       |
       |---META-INF
       |---org
       |---StemmerTest.class
       |---snowball.jar
       |---weka.jar

如有任何帮助,我将不胜感激

编辑 1: 生成的 ANT 脚本:

<project default="create_run_jar" name="Create Runnable Jar for Project StemmerTest with Jar-in-Jar Loader">
<!--this file was created by Eclipse Runnable JAR Export Wizard-->
<!--ANT 1.7 is required                                        -->
<target name="create_run_jar">
    <jar destfile="stem.jar">
        <manifest>
            <attribute name="Main-Class" value="org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader"/>
            <attribute name="Rsrc-Main-Class" value="StemmerTest"/>
            <attribute name="Class-Path" value="."/>
            <attribute name="Rsrc-Class-Path" value="./ snowball-2012.jar weka.jar snowball.jar"/>
        </manifest>
        <zipfileset src="jar-in-jar-loader.zip"/>
        <zipfileset dir="resources/lib" includes="snowball-2012.jar"/>
        <fileset dir="bin"/>
        <zipfileset dir="." includes="weka.jar"/>
        <zipfileset dir="." includes="snowball.jar"/>
    </jar>
</target>

编辑 2:

这里是请求的 MANIFEST.MF 的内容。

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.1
Created-By: 23.25-b01 (Oracle Corporation)
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
Rsrc-Main-Class: StemmerTest
Rsrc-Class-Path: ./ weka.jar snowball.jar
Class-Path: .

提前致谢, 铁法

【问题讨论】:

  • 好吧,这并不是抱怨 weka 和 snowball 不在类路径中,因为它们是。它抱怨 JDBC 驱动程序不在类路径中。也许 weka 和 snowball 有可以编辑的配置文件,并删除数据库依赖。我对 weka 或雪球一无所知。
  • 运行一个 jar 文件,其中还包含依赖的 jars 是非常重要的。这不仅仅是将代码导出到 jar 文件的问题。必须制作一个相当可怕的 MANIFEST.MF 文件并将其包含在内。此链接(docs.oracle.com/javase/1.5.0/docs/guide/jar/jar.html#Name-Valuepairs 和 Sections )有点旧,但指向正确的方向。如果您使用的是 Maven,那么它有很好的工具来消除一些痛苦
  • 当输出为“Stemmer 'porter' unknown!”时这意味着 weka 在类路径中没有找到雪球包。 Wiki
  • @DaveHowes 我正在使用 eclipse 生成的 ant 脚本......我现在将它包含在我的问题中......我根本不是 ant 或 maven 专家,这就是我使用生成的原因eclipse 的 ant 脚本...如果您知道如何编辑脚本以使其正常工作,我将不胜感激 :) ...
  • 你能发布你的 manifest.mf 文件的内容吗?

标签: java weka snowball


【解决方案1】:

虽然我不清楚,但我设法通过执行以下操作解决了这个烦人的问题(大约 10 小时后 -.-):-

  • 对“snowball.jar”使用“zipgroupfileset”而不是“fileset”来展平生成的jar文件中的内容。

  • 从类路径中排除“snowball.jar”(因为它已经包含在生成的 jar 文件中)。

由于某些未知的原因,weka.jar 中的雪球包装器在其展平(提取)之前无法找到 snowball.jar。

这是适合我的 ant 脚本:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project default="jar">
    <path id="dep.runtime">
        <fileset dir="./libs">
            <include name="**/*.jar" />
            <exclude name="**/snowball.jar"/>
        </fileset>
    </path>

    <manifestclasspath property="manifest_cp" jarfile="stem.jar">
        <classpath refid="dep.runtime" />
    </manifestclasspath>

    <target name="jar">
        <jar destfile="stem.jar">
            <manifest>
                <attribute name="Main-Class" value="StemmerTest"/>
                <attribute name="Class-Path" value="${manifest_cp}"/>
            </manifest>
            <zipgroupfileset dir="./libs" includes="snowball.jar"/>
            <fileset dir="bin"/>
        </jar>
    </target>
</project>

如果有人使用雪球词干分析器,希望这会有所帮助。

【讨论】:

  • 嗨,我也面临同样的问题。我尝试使用上述相同的东西。但仍然遇到问题。你知道我该如何解决它。
【解决方案2】:

我是在 1 小时的测试后完成的,因为 wiki 上没有关于这件事的任何内容。解决方法是这样的:

SnowballStemmer stemmer = new SnowballStemmer();
stemmer.setStemmer("English");
StringToWordVector STWfilter = new StringToWordVector(1000);
STWfilter.setUseStoplist(true);
STWfilter.setIDFTransform(true);
STWfilter.setTFTransform(true);
STWfilter.setNormalizeDocLength(new SelectedTag(StringToWordVector.FILTER_NORMALIZE_ALL, StringToWordVector.TAGS_FILTER));
STWfilter.setOutputWordCounts(true);
STWfilter.setStemmer(stemmer);
STWfilter.setInputFormat(train);

我发布了整个示例,以便为您节省我花在正确方法上的 1 小时。

【讨论】:

    【解决方案3】:

    我在使用多线程处理 Snowball 时遇到了同样的问题。我是这样解决的:

    SnowballStemmer st = new SnowballStemmer();
    do{
                //wait until the German stemmer is initialized
    }while(!st.stemmerTipText().contains("german"));
    st.setStemmer("german");
    filter.setStemmer(st);
    

    错误消息“Stemmer 'porter' unknown!”会留下来,但它会正确设置,即德语词干分析器。

    【讨论】:

      【解决方案4】:

      我遵循了这个方法,它已经奏效了。我的 IDE 是 NetBeans。我已经从here 下载了jar。它是 Snowball 词干分析器标题下的第二个选项。我已将其添加到我的类路径中,并使用以下代码将词干分析器添加到过滤器中。

      SnowballStemmer stemmer = new SnowballStemmer();
      stemmer.setStemmer("english");
      StringToWordVector filter = new StringToWordVector();
      filter.setStemmer(stemmer);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-05
        • 1970-01-01
        • 1970-01-01
        • 2014-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多