6

ここでlangdetectホストされている Java ライブラリを使用しようとしています。これほど簡単に使用することはできません:

Detector detector;
String langDetected = "";
try {
    String path = "C:/Users/myUser/Desktop/jars/langdetect/profiles";
    DetectorFactory.loadProfile(path);
    detector = DetectorFactory.create();
    detector.append(text);
    langDetected = detector.detect();
} 
catch (LangDetectException e) {
    throw e;
}

return langDetected;

DetectFactory.loadProfileメソッドに関しては除きます。langdetectこのライブラリは、絶対ファイル パスを渡すとうまく機能しますが、最終的には、コードとそのコンパニオンprofilesディレクトリを同じ JAR ファイル内にパッケージ化する必要があると思います。

myapp.jar/
    META-INF/
    langdetect/
        profiles/
            af
            bn
            en
            ...etc.
    com/
        me/
            myorg/
                LangDetectAdaptor --> is what actually uses the code above

LangDetectAdaptor内部にある に、実行時に動作するために必要なと依存関係myapp.jarの両方が提供されるようにします。ただし、機能するために何を渡す必要があるかについては混乱しています。langdetect.jarjsonic.jarlangdetectDetectFactory.loadProfile

  • langdetectJAR にはディレクトリが付属していますが、profilesJAR 内から初期化する必要があります。ディレクトリをコピーしprofilesて JAR 内に配置しますか (上記で説明したように)、または内部に保持しlangdetect.jarてコード内からアクセスする方法はありますか?

ここで助けてくれてありがとう!

編集:ここでの問題は、このディレクトリに同langdetect profilesされているが、JAR内から初期化する必要があることだと思います。profilesAPI は、独自の構成を考慮しDetectFactory.loadProfiles().except("fr")て、フランス語などを初期化したくない場合のようなメソッドを提供するように少し変更することでおそらく恩恵を受けるでしょう。しかし、これでも私の問題は解決しません!

4

5 に答える 5

7

私も同じ問題を抱えてる。JarUrlConnection およびJarEntryを使用して、LangDetect jar からプロファイルをロードできます。この例では、Java 7 リソース管理を使用していることに注意してください。

    String dirname = "profiles/";
    Enumeration<URL> en = Detector.class.getClassLoader().getResources(
            dirname);
    List<String> profiles = new ArrayList<>();
    if (en.hasMoreElements()) {
        URL url = en.nextElement();
        JarURLConnection urlcon = (JarURLConnection) url.openConnection();
        try (JarFile jar = urlcon.getJarFile();) {
            Enumeration<JarEntry> entries = jar.entries();
            while (entries.hasMoreElements()) {
                String entry = entries.nextElement().getName();
                if (entry.startsWith(dirname)) {
                    try (InputStream in = Detector.class.getClassLoader()
                            .getResourceAsStream(entry);) {
                        profiles.add(IOUtils.toString(in));
                    }
                }
            }
        }
    }

    DetectorFactory.loadProfile(profiles);
    Detector detector = DetectorFactory.create();
    detector.append(text);
    String langDetected = detector.detect();
    System.out.println(langDetected);
于 2013-03-11T05:51:42.427 に答える
4

Maven サポートが利用できず、プロファイルをロードするメカニズムが完全ではなかったため (リソースの代わりにファイルを定義する必要があるため)、その問題を解決するフォークを作成しました。

https://github.com/galan/language-detector

元の作者にメールを送ったので、彼は変更をフォーク/維持できますが、運が悪く、プロジェクトは放棄されたようです。

これを今すぐ使用する方法の例を次に示します (必要に応じて独自のプロファイルを作成できます)。

DetectorFactory.loadProfile(new DefaultProfile()); // SmProfile is also available
Detector detector = DetectorFactory.create();
detector.append(input);
String result = detector.detect();
// maybe work with detector.getProbabilities()

DetectorFactory が使用する静的なアプローチは好きではありませんが、プロジェクト全体を書き直すつもりはありません。独自の fork/pull リクエストを作成する必要があります :)

于 2014-06-25T07:12:42.107 に答える
3

ライブラリはファイルのみを受け入れるようです。コードを変更して、アップストリームに変更を送信してみてください。または、リソースを一時ファイルに書き込んで、それをロードします。

于 2012-08-17T14:27:30.170 に答える