2020年7月27日月曜日

【63】番外編 形態素解析器SudachiをAtoM2.6に導入

番外編2です。Kuromojiよりも語彙や分割能力に優れた形態素解析器SudachiをAtoM2.6に導入できたので、報告します。
正確に言えば、AtoM2.6のために使っているElasticsearchに、プラグインelasticsearch-sudachiをインストールしました。
プラグインelasticsearch-sudachiは、こちらのサイトを参照。https://github.com/WorksApplications/elasticsearch-sudachi
インストールは、こちらの手順を参考にしました。https://qiita.com/sorami/items/99604ef105f13d2d472b

まずは、AtoM2.6に入っているElasticsearchのバージョンを確認します。
マシンは、ubuntu 18.04(virtual machine)、java1.8です。
curl http://localhost:9200 (curlがなければsudo apt install curlでインストール)
 "number" : "5.6.16",
 "lucene_version" : "6.6.1"
の二つをチェックしておきます。
このバージョンに応じてsudachiを設定します。

gitとMavenを使うので、事前にインストール。
sudo apt install git
sudo apt install maven

ここからelasticsearch-sudachiを入れていきますが、最新版を入れたせいで、えらい目に遭いました。以下、苦労した話を書いた後に、簡単に進められると考えられるやり方について触れます。

ソースコードを持ってくる
git clone https://github.com/WorksApplications/elasticsearch-sudachi.git
ソースコードは、/home/ユーザー(ユーザーはご自身のものを入れてください)の直下にあります。
そっちに移動して
cd elasticsearch-sudachi
ビルドする。
mvn package
以下のエラーが起こります。
Caused by: org.apache.maven.plugin.compiler.CompilationFailureException: Compilation failure
No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
これを修正していきます。

javacが必要(*)。
sudo apt install openjdk-8-jdk-headless software-properties-common

設定ファイルを変更(**)。
sudo vim elasticsearch-sudachi/pom.xml
4~7行目あたりにある<version>、<lucene.version>を次に変更。
             <version>5.6.16-2.0.2-SNAPSHOT</version>
             <lucene.version>6.6.1</lucene.version>
33~38行目あたりの<plugin>内に緑を追加。
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <fork>true</fork>
                    <executable>/usr/lib/jvm/java-8-openjdk-amd64/bin/javac</executable>
                </configuration>

再度、ビルドに失敗する。
エラーメッセージは、
/home/ユーザー/elasticsearch-sudachi/src/main/java/com/worksap/nlp/elasticsearch/sudachi/index/SudachiTokenizerFactory.java:[43,29] エラー: 不適合な型: SettingsをStringに変換できません:
でした。そこを確認して修正する。
sudo vim /home/ユーザー/elasticsearch-sudachi/src/main/java/com/worksap/nlp/elasticsearch/sudachi/index/SudachiTokenizerFactory.java
41〜50行目あたりのファイル記述を変更。
    public SudachiTokenizerFactory(IndexSettings indexSettings,
            Environment env, String name, Settings settings) throws IOException {
        -super(indexSettings, settings, name);
        +super(indexSettings, name, settings);
        mode = getMode(settings);
        discardPunctuation = settings.getAsBoolean("discard_punctuation", true);
        resourcesPath = new SudachiPathResolver(env.configFile().toString(),
                settings.get("resources_path", "sudachi")).resolvePathForDirectory();
        settingsPath = new SudachiSettingsReader(env.configFile().toString(),
                settings.get("settings_path")).read();
    }

再々度、ビルドに失敗。
エラーメッセージは
[ERROR] /home/ユーザー/elasticsearch-sudachi/src/test/java/com/worksap/nlp/lucene/sudachi/ja/TestSudachiAnalyzer.java:[156,58] エラー: intは間接参照できません
[ERROR] /home/ユーザー/elasticsearch-sudachi/src/test/java/com/worksap/nlp/lucene/sudachi/ja/TestSudachiAnalyzer.java:[159,58] エラー: intは間接参照できません
[ERROR] /home/ユーザー/elasticsearch-sudachi/src/test/java/com/worksap/nlp/lucene/sudachi/ja/TestAnalysisSudachi.java:[184,20] エラー: クラス Builderのメソッド loadFromStreamは指定された型に適用
です。解決していきます。
sudo vim /home/ユーザー/elasticsearch-sudachi/src/test/java/com/worksap/nlp/lucene/sudachi/ja/TestSudachiAnalyzer.java
155〜159行を修正。
155             query = queryParser.parse("京都");
156-           assertThat(searcher.search(query, 5).totalHits.value, is(0L));
       +           assertThat(searcher.search(query, 5).totalHits, is(0));
157
158            query = queryParser.parse("岩波");
159-             assertThat(searcher.search(query, 5).totalHits.value, is(0L));
      +           assertThat(searcher.search(query, 5).totalHits, is(0));

sudo vim /home/ユーザー/elasticsearch-sudachi/src/test/java/com/worksap/nlp/lucene/sudachi/ja/TestAnalysisSudachi.java
186行目
186-                        .loadFromStream(RESOURCE_NAME_SUDACHI_ANALYSIS_JSON, input, true)
186+                       .loadFromStream(RESOURCE_NAME_SUDACHI_ANALYSIS_JSON, input)
と直しました。

mvn package
でビルドに成功。

インストールを試みる。
sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install file:///home/ユーザー/elasticsearch-sudachi/target/releases/analysis-sudachi-5.6.16-2.0.2-SNAPSHOT.zip
エラーがまた発生。
ERROR: `elasticsearch` directory is missing in the plugin zip
昼寝して落ち着く。その後、次のファイルを全部書き換え。
sudo vim elasticsearch-sudachi/src/main/assemblies/plugin.xml
<assembly>
<id>executable</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<files>
<file>
<source>src/main/extras/plugin-descriptor.properties</source>
<outputDirectory>elasticsearch</outputDirectory>
<filtered>true</filtered>
</file>
<file>
<source>LICENSE</source>
<outputDirectory>elasticsearch</outputDirectory>
<filtered>false</filtered>
</file>
</files>
<dependencySets>
<dependencySet>
<outputDirectory>elasticsearch</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<includes>
<include>com.worksap.nlp:*</include>
<include>org.glassfish:javax.json</include>
</includes>
</dependencySet>
</dependencySets>
</assembly>
をコピーペースト。

もう一度、
mvn package
して、
sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install file:///home/ユーザー/elasticsearch-sudachi/target/releases/analysis-sudachi-5.6.16-2.0.2-SNAPSHOT.zip
インストールに成功。
sudo /usr/share/elasticsearch/bin/elasticsearch-plugin list
analysis-sudachiがあればOK.

とまあ、長いこと書いてきましたが、Gitから適切なバージョンのソースコードがあれば恐らく問題なしです。
git clone —depth=1 -b v5.6.16-2.0.2 https://github.com/WorksApplications/elasticsearch-sudachi.git
を取ってきて、
(*)(**)
を行えば、mvn packageによるビルドは問題ないと思います。

続いて、辞書をインストール。一番語彙の多いフル辞書を入れます。
wget https://object-storage.tyo2.conoha.io/v1/nc_2520839e1f9641b08211a5c85243124a/sudachi/sudachi-dictionary-latest-full.zip
unzip sudachi-dictionary-latest-full.zip
sudo mkdir /etc/elasticsearch/sudachi
sudo cp /home/ユーザー/sudachi-dictionary-20200330/system_full.dic /etc/elasticsearch/sudachi
Elasticsearchを再起動。
sudo /etc/init.d/elasticsearch restart
analysis-sudachiのインストールを確認する。
curl -X GET 'http://localhost:9200/_nodes/plugins?pretty'
pluginsにanalysis-sudachiが入っていれかどうかを確認。
Elasticsearchに辞書があるかも確認する。
sudo ls /etc/elasticsearch/sudachi/

最後にAtoMでSudachiが動くように設定する。Kuromojiと一緒です。
cd /usr/share/nginx/atom
sudo nano plugins/arElasticSearchPlugin/config/search.yml
japanese:
   tokenizer: sudachi_tokenizer
   filter: [sudachi_baseform, sudachi_split, sudachi_ja_stop]
     フィルターはたくさんあるので、今後、要検討です。
sudo nano plugins/arElasticSearchPlugin/lib/arElasticSearchMapping.class.php 
   'it' => 'italian',
'
   ja' => 'japanese',

以上です。
Gitから適切なバージョンのソースコードさえ持ってこれたら、非常に簡単な作業にな離ます。ですが、今回は失敗も含めた作業過程を紹介しました。今後、ブラッシュアップしていくつもりです。






最近の投稿

【108】Archives in the Digital Age: The use of AI and machine learning in the Swedish archival sectorを読む

 Gijs Aangenendt氏の修士論文、Archives in the Digital Age: The use of AI and machine learning in the Swedish archival sectorを半分読みました。 前半は、AIを扱ったアーカ...

人気の投稿