1

この問題は本当に頭がおかしくなり、

ほとんどの人が考えていることに答えるために: はい、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 が認識されない理由がわかりません...エクスポートされた jar には weka.jar と snowball.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: .

前もってありがとう、TeFa

4

4 に答える 4

2

私には明確ではありませんが、次のことを行うことで、この厄介な問題を解決することができました(〜10時間後-.-):-

  • 「snowball.jar」の「fileset」の代わりに「zipgroupfileset」を使用して、生成された 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 Stemer を使用している場合、これが役立つことを願っています。

于 2013-06-22T06:16:20.573 に答える
0

私はこの方法に従いましたが、うまくいきました。私の IDE は NetBeans です。ここからjarファイルをダウンロードしました。これは、Snowball Stemmers というタイトルの 2 番目のオプションです。それをクラスパスに追加し、次のコードを使用してステマーをフィルターに追加しました。

SnowballStemmer stemmer = new SnowballStemmer();
stemmer.setStemmer("english");
StringToWordVector filter = new StringToWordVector();
filter.setStemmer(stemmer);
于 2014-11-02T05:25:50.087 に答える
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 時間を節約できるように、例全体を投稿しました。

于 2013-11-19T19:48:07.120 に答える
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);

エラーメッセージ「Stemmer 'porter' unknown!」残りますが、ドイツ語ステマーを正しく設定します。

于 2014-05-05T07:56:08.540 に答える