在JAR中导出时,Weka和Snowball不起作用

时间:2013-06-21 14:48:57

标签: java weka snowball

这个问题真让我疯狂,

回答大多数人都在想:是的,我加入了snowball.jar到CLASSPATH

我有一个简单的主类,它应该阻止“去”到“去”这个词:

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

然而当我从eclipse“stem.jar”将其导出为可运行的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: .

先谢谢, 特发

4 个答案:

答案 0 :(得分:2)

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

  • 使用“zipgroupfileset”代替“snowset.jar”的“fileset”来展平生成的jar文件中的内容。

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

对于一些未知的原因,weka.jar中的雪球包装器找不到snowball.jar直到它变平(提取)。

以下是适用于我的蚂蚁脚本:

<?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>

希望如果有人使用雪球塞,这会有所帮助。

答案 1 :(得分:0)

我在经过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小时的时间,这是正确的。

答案 2 :(得分:0)

我使用多线程与Snowball有同样的问题。我这样解决了:

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

错误消息&#34; Stemmer&#39; porter&#39; !未知#&34;将留下来,但它将正确设置德国干扰器。

答案 3 :(得分:0)

我已经按照这种方法运行了。我的IDE是NetBeans。我从here下载了jar。这是Snowball词干的标题下的第二个选项。我已将它添加到我的类路径中,并使用以下代码将stemmer添加到过滤器中。

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