60336


SudachiというJavaの形態素解析ツールを使いたいと思います。Sudachiは辞書が別配布になっているため、Sudachi本体と辞書を1つのjarファイルにまとめたのですが、mavenに不慣れでどのように設定していいかで困っています。

# やりたいこと

辞書込みのjarファイルをartifactoryに設置して、別プロジェクトからjarファイルを読み込むだけでSudachiによる形態素解析ができるようにしたい。

なぜこのようなことをするかというと、これも知識不足でお恥ずかしいのですが、MapReduceプロセスでSudachi辞書がロードできずに止まってしまいます。Kuromojiでは動いているため、同様に1つのjarにまとめれば問題が起きないと期待しています。

# 関連リンク

  * <https://github.com/WorksApplications/Sudachi>
  * <https://github.com/WorksApplications/SudachiDict>

# やったこと

Kuromojiのpom.xmlを参考にしました。kuromoji本体ではなく、次のビルドスクリプトでneologdを使ったkuromojiを参考にしています。

<https://github.com/kazuhira-r/kuromoji-with-mecab-neologd-
buildscript/blob/master/build-atilika-kuromoji-with-mecab-ipadic-neologd.sh>

# pom.xml

あまり理解せずに書いていて恐縮ですが、次のようなpom.xmlを作成しました。

[code]

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.xxx.sudachi</groupId>
        <artifactId>sudachi</artifactId>
        <version>0.3.0-20190927</version>
    
        <name>Sudachi my version</name>
    
        <packaging>jar</packaging>
    
        <properties>
            <sudachi.dict>sudachi-dictionary-20190927</sudachi.dict>
            <sudachi.dict.file>${sudachi.dict}-full.zip</sudachi.dict.file>
            <sudachi.dict.url>https://object-storage.tyo2.conoha.io/v1/nc_2520839e1f9641b08211a5c85243124a/sudachi/${sudachi.dict.file}</sudachi.dict.url>
            <sudachi.dict.dir>${project.basedir}/dictionary/mecab-ipadic-2.7.0-20070801</sudachi.dict.dir>
            <sudachi.dict.targetdir>${project.basedir}/src/main/resources/com/atilika/kuromoji/ipadic</sudachi.dict.targetdir>
        </properties>
    
        <build>
            <plugins>
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>3.0.0</version>
                    <executions>
                        <execution>
                            <id>copy-license-resources</id>
                            <phase>generate-resources</phase>
                            <goals>
                                <goal>copy-resources</goal>
                            </goals>
                            <configuration>
                                <outputDirectory>${project.build.outputDirectory}/META-INF</outputDirectory>
                                <resources>
                                    <resource>
                                        <!-- Becomes top level directory. Is there a better way to do this? -->
                                        <directory>${project.basedir}/dictionary</directory>
                                        <filtering>false</filtering>
                                        <includes>
                                            <include>${sudachi.dict}</include>
                                        </includes>
                                    </resource>
                                </resources>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    
        <profiles>
            <profile>
                <id>compile-dictionary</id>
                <activation>
                    <property>
                        <name>!skipCompileDictionary</name>
                    </property>
                </activation>
                <build>
                    <plugins>
                        <plugin>
                            <groupId>org.apache.maven.plugins</groupId>
                            <artifactId>maven-antrun-plugin</artifactId>
                            <version>1.6</version>
                            <executions>
                                <execution>
                                    <id>download-dictionary</id>
                                    <phase>generate-resources</phase>
                                    <configuration>
                                        <target unless="skipDownloadDictionary">
                                            <echo message="Downloading dictionary"/>
                                            <delete dir="dictionary"/>
                                            <mkdir dir="dictionary"/>
                                            <get src="${sudachi.dict.url}"
                                                 dest="dictionary/${sudachi.dict.file}"/>
                                            <unzip src="dictionary/${sudachi.dict.file}"
                                                   dest="dictionary"/>
                                        </target>
                                    </configuration>
                                    <goals>
                                        <goal>run</goal>
                                    </goals>
                                </execution>
                            </executions>
                        </plugin>
    
                    </plugins>
                </build>
            </profile>
        </profiles>
    
        <dependencies>
            <dependency>
                <groupId>com.worksap.nlp</groupId>
                <artifactId>sudachi</artifactId>
                <version>0.3.0</version>
            </dependency>
        </dependencies>
    </project>
    
[/code]

# 計画はあるがまだ行っていないこと

  * sudachi.json をプロジェクトに追加していない
  * コードはまだ書いていない（jarファイル内のsudachi.jsonを読み、辞書の初期化をするコードが必要）

# 質問 (2019年10月15日追記）

上記のコピペpom.xmlの問題点と修正すべき点があればご指摘ください。上記の通り目的は1つのjarファイルを配置するだけで辞書の置き場などの設定抜きに文字列分割ができることです。

# 追記2 (2019年10月15日追記）

「Sudachiの辞書がMapReduceで読めない」こととpom.xmlの設定がわからないことは別問題です。

参考：Getting file resource from Jar in Hadoop  
<https://stackoverflow.com/questions/43100956/getting-file-resource-from-jar-
in-hadoop>

MapReduceでSudachiが使えない問題の回避方法は複数あると思います。上記のリンク先で言及されているように、Distributed
cacheを使う手もあるでしょうが、今回はSudachi.jarを作ることで回避したいと思っています。Kuromojiは辞書とプログラムが1つのjarに入っていて、これは問題なくMapReduceから使うことができますし、他の細かい問題も同時に解決するからです。

繰り返しになりますが、質問の趣旨は

  * SudachiとSudachi辞書を1つのjarファイルに入れること
  * 他のプロジェクトから、次のように（これはkuromoji）jarファイルを参照できること
  * String tokenized = Sudachi.tokenize("今日は水曜日です"); のようなインタフェースをjarファイル内に実装すること。

[code]

            <dependency>
                <groupId>自分のリポジトリ.kuromoji</groupId>
                <artifactId>kuromoji-unidic</artifactId>
                <version>0.9.0</version>
            </dependency>
    
    
[/code]

よろしくお願いします。


CC BY-SA 4.0
2019-10-14T23:17:03.287
59707
2019-11-08T02:26:48.077
2019-10-15T06:44:10.513
14631
14631
question
java maven
mavenで全部入りのjarファイルを作る方法について


> プライベートリポジトリは既にありますのでjarファイルを作るところだけが問題です。

依存するライブラリーをまとめて1つのjarファイルを作成したいのであれば、maven-assemblyプラグインとかmaven-
shadeプラグインが使えると思います。前者であれば、このページが参考になると思います。

<https://etc9.hatenablog.com/entry/20101210/1291996946>


CC BY-SA 4.0
2019-10-15T07:27:05.800
59716
2019-10-15T07:27:05.800
21092
59707
answer


Sudachiは
[README](https://github.com/WorksApplications/Sudachi/blob/develop/README.md#%E3%82%B9%E3%83%A2%E3%83%BC%E3%83%AB%E3%83%95%E3%83%AB%E8%BE%9E%E6%9B%B8%E3%81%AE%E5%88%A9%E7%94%A8%E6%96%B9%E6%B3%95)にあるとおり、`-s`で設定ファイルを指定し(未指定の場合は[デフォルト設定](https://github.com/WorksApplications/Sudachi/blob/develop/src/main/resources/sudachi.json)が用いられる)、この設定のうちの
`systemDict` によって辞書を指定するかと思います。

ここで指定した文字列が解釈されるのは
[`MMap.map`](https://github.com/WorksApplications/Sudachi/blob/develop/src/main/java/com/worksap/nlp/sudachi/MMap.java#L52)メソッドのようですが、この箇所を見ると明らかな通り、この文字列とは
**ファイル名** です。

つまりSudachiでは、辞書はファイルシステム上にファイルとして存在していなければならない、という前提がありそうです。

たとえ

> SudachiとSudachi辞書を1つのjarファイルに入れ

られたとしても、その辞書を読む機能がSudachi本体に無さそうだ、ということです。

* * *

対応方法の一例として、ファイル名指定でなくクラスパスを基点にしたリソース名で指定するように変更してみました。

  * <https://github.com/yukihane/Sudachi/commits/feature/dict-as-resource>

本質的な変更点は[このコミット](https://github.com/yukihane/Sudachi/commit/425abd055e70cd87643947dd2cb5f7b858ce9340#diff-007681940935a2f59aca0cbde0d8bba1L52)になります。

全部入りのjarを作る指示は[この部分](https://github.com/yukihane/Sudachi/commit/99ffe7f7471fe4563c1dec8d0decc8267a33ef14)です。

詳しいビルド方法は[こちら](https://github.com/yukihane/Sudachi/blob/feature/dict-as-
resource/how-to-build.txt)に書きました。

* * *

(追記)  
"全部入りのjarファイル" を誤解していました。やりたいことは

> Sudachi本体と辞書を1つのjarファイルにまとめ

ることですね。  
であれば、

>
> 全部入りのjarを作る指示は[この部分](https://github.com/yukihane/Sudachi/commit/99ffe7f7471fe4563c1dec8d0decc8267a33ef14)です。

は不要です。  
単に [`src/main/resources/` ディレクトリに
辞書ファイルを置い](https://github.com/yukihane/Sudachi/blob/3f5566421c29667e67c447346139199155f9ea48/how-
to-build.txt#L3-L8)てビルドするだけで良いです。

(いわゆるfat-jar/uberjarを作りたいのだと勘違いしていました)


CC BY-SA 4.0
2019-11-07T16:35:11.423
60336
2019-11-08T02:26:48.077
2019-11-08T02:26:48.077
2808
2808
59707
answer