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

标签 java weka snowball

这个问题真让我抓狂,

回答大多数人的想法:是的,我将 Snowball.jar 添加到了类路径

我有一个简单的主类,应该将“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

但是当我从 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: .

提前致谢, 特法

最佳答案

虽然我不清楚,但我通过执行以下操作成功解决了这个恼人的问题(大约 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>

希望这对使用雪球词干分析器的人有所帮助。

关于java - 在 JAR 中导出时,Weka 和 Snowball 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17238184/

相关文章:

java - 网络圈。获取线程池ID

java - WSO2 Identity Server 5.10.0 和 Samples 4.2.0 继续出现 java.lang.ClassCastException : class org. opensaml.saml1.core.impl.ActionBuilder

indexing - Elasticsearch : How to list each analyzer used by a specific index

java - 使用 weka API 对高维 int vector 进行分类的最佳方法是什么?

java - 如何在 weka 中表示用于分类的文本?

elasticsearch - ElasticSearch:使用雪球分析器时奇怪的搜索行为

python - 雪球词干提取器 : poor french stemming

java - 我可以使用哪个 Java 集合?

java - 将 JScrollPane 锁定到 JTextArea 的底部(java swing)

java - 如何从 weka API 计算置信度?