Java Weka和Snowball don';在JAR中导出时无法工作

Java Weka和Snowball don';在JAR中导出时无法工作,java,weka,snowball,Java,Weka,Snowball,这个问题真的快把我逼疯了 回答大多数人的想法:是的,我在类路径中添加了snowball.jar 我有一个简单的主类,应该将“going”这个词词干到“go”: 首先当我在eclipse中运行它时,它会工作,并得到以下输出: Refreshing GOE props... ---Registering Weka Editors--- Trying to add database driver (JDBC): RmiJdbc.RJDriver - Warning, not in CLASSPATH?

这个问题真的快把我逼疯了

回答大多数人的想法:是的,我在类路径中添加了snowball.jar

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

首先当我在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
Refreshing GOE props...
[KnowledgeFlow] Loading properties and plugins...
[KnowledgeFlow] Initializing KF...
Stemmer 'porter' unknown!
Stemmer 'english' unknown!
going
但是当我从eclipse“stem.jar”中将其导出为可运行jar并在终端“java-jar stem.jar”中执行时,它不工作,我得到以下输出:

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
Refreshing GOE props...
[KnowledgeFlow] Loading properties and plugins...
[KnowledgeFlow] Initializing KF...
Stemmer 'porter' unknown!
Stemmer 'english' unknown!
going
我不知道为什么snowball.jar在导出的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>
提前感谢,,
TeFa

虽然我不清楚,但我还是通过以下方法解决了这个恼人的问题(大约10小时后-。-):-

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

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

不知什么原因,weka.jar中的snowball包装器在展平(提取)之前找不到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>


如果有人在使用snowball词干分析器,希望这能有所帮助。

我是在测试了1小时后做的,因为维基上没有这方面的内容。解决方案如下:

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小时。

我在使用多线程进行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!”将保留,但它将正确设置,即德国Stemmer。

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

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

这并不是说weka和snowball不在课堂上,因为他们在。它抱怨JDBC驱动程序不在类路径中。也许weka和snowball有配置文件,您可以编辑这些文件,并删除数据库依赖项。我对weka或snowball一无所知。运行一个包含依赖jar的jar文件是非常重要的。这不仅仅是将代码导出到jar文件的问题。用户必须创建一个相当可怕的MANIFEST.MF文件并将其包含在内。这个链接(成对和部分)有点旧,但指向正确的方向。如果您使用的是Maven,那么当输出为“Stemmer'porter'unknown!”时,这就有了很好的工具来消除一些痛苦,这意味着weka没有在类路径中找到snowball包@DaveHowes我正在使用eclipse生成的ant脚本。。。我现在把它包括在我的问题中。。。我根本不是ant或maven方面的专家,这就是为什么我使用eclipse生成的ant脚本。。。如果您知道如何编辑脚本以使其正常工作,我将非常感激:)…您可以发布manifest.mf文件的内容吗?您好,我也面临同样的问题。我试着用上面提到的同样的东西。但还是有问题。你知道我该怎么解决吗。