kuromojiをneologdの辞書に対応させる

デフォルトの辞書のままkuromojiを使うというのは、相当不利だということがわかってきて、新しい言葉に対応しているneologdを使えるようにしたいと思った。次のサイトが最終的に参考にできた。感謝いたします。
http://d.hatena.ne.jp/Kazuhira/20150814/1439565514
3年前のものだが、タイムスタンプなどを、ちょっと変えるだけで、結果的にうまく言ったのでそれを記載しておく。以下、macでやっているので誤解なく。

適当なフォルダに移動し、kuromojiのソースを取ってくる。

$ git clone https://github.com/atilika/kuromoji.git

CSV辞書を作成する。

$ git clone https://github.com/neologd/mecab-ipadic-neologd.git
$ cd mecab-ipadic-neologd
$ libexec/make-mecab-ipadic-neologd.sh

先ほどのkuromojiのフォルダへ移動し、フォルダを作成し、CSVの辞書をコピーする。ここで、../mecab-ipadic-neologd/build/にある、辞書のタイムスタンプを確認しなければならない。この時点では、20180831となっていた。

$ mkdir kuromoji-ipadic/dictionary
$ cp -R /path/to/mecab-ipadic-neologd/build/mecab-ipadic-2.7.0-20070801-neologd-20180831 kuromoji-ipadic/dictionary

ビルドを行う前に、コンパイル時のヒープを広げておく。

$ export MAVEN_OPTS='-Xmx4g'

ビルドします。mavenが必要になる。

$ mvn -pl kuromoji-ipadic -am package -DskipTests=true -DskipDownloadDictionary=true -Dkuromoji.dict.dir=kuromoji-ipadic/dictionary/mecab-ipadic-2.7.0-20070801-neologd-20180831 -Dkuromoji.dict.encoding=utf-8

これで、kuromoji-ipadic/target/に、jarファイルができている。

-rw-r--r--  1 washida  staff  112358570  9  9 08:42 kuromoji-ipadic-1.0-SNAPSHOT.jar

これだけでいいかと思ったのが浅はかだった。これをまえのkuromojiと同じようにライブラリファイルとしてくっつければ動くかと思ったのだが、クラスが見つからないという激しいエラーが出て失敗。ここで使っている親クラスがないぜということだった。結局それが、kuromoji-coreフォルダにあることがわかったので、そこもビルドする。まえのコマンドラインのフォルダだけ変えた。それでいいのかどうかわからなかったが、まあ、ビルドが成功したのでOK。

$ mvn -pl kuromoji-core -am package -DskipTests=true -DskipDownloadDictionary=true -Dkuromoji.dict.dir=kuromoji-ipadic/dictionary/mecab-ipadic-2.7.0-20070801-neologd-20180831 -Dkuromoji.dict.encoding=utf-8

これで、kuromoji-core/targetにjarファイルができているので、これも同時に、ライブラリとして登録したら、うまくビルドできた。

import com.atilika.kuromoji.ipadic.Token;
import com.atilika.kuromoji.ipadic.Tokenizer;
public class KuromojiNeologdTest2 {

    public static void main(String[] args) {
        Tokenizer tokenizer = new Tokenizer();
        String phrase = "溺れる者は藁をも掴む";
        for (Token token : tokenizer.tokenize(phrase)) {
            System.out.println(token.getBaseForm());
            System.out.println(token.getConjugationForm());
            System.out.println(token.getConjugationType());
            System.out.println(token.getPartOfSpeechLevel1());
            System.out.println(token.getPartOfSpeechLevel2());
            System.out.println(token.getPartOfSpeechLevel3());
            System.out.println(token.getPartOfSpeechLevel4());
            System.out.println(token.getPronunciation());
            System.out.println(token.getReading());
            System.out.println();
        }
    }
}

以前のkuromojiだと、ことわざの中身を形態要素解析してしまっていたが、これは、丸ごと扱っている。

run:
溺れる者は藁をも掴む
*
*
名詞
固有名詞
一般
*
オボレルモノハワラオモツカム
オボレルモノハワラヲモツカム

最後に、kuromoji-ipadicの他にkuromoji-ipadic-neologdフォルダもあって、neologdが付いているのでそっちの方がいいかと思ったが、どう違うかわからない。ただ、こちらの方がneologdが付いているので、いいような気がして、そちらをコンパイルして、使って見たが、結果も同じものだった。後者を使おうと思っている。

Neologの辞書を使ってword2vecのデータを作成し直す

前の記事でword2vecのデータを作ったとかいたが、mecabの辞書をNeologのものにした方が良いので、再度作り直した。mecabに持って行くときにダウンロードして作成したNeolog辞書を使うように指定するだけで良い。

私の場合のコマンドラインは、次のようになる。

mecab -Owakati -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd/ jawiki.txt -o data.txt

作成したデータは何倍にも大きくなった。

日本語Wikipediaデータをword2vecで類語検索する

去年、これをやっていたのだが、色々あって他のことに関心が向かったために、使いきれずにおいていたが、もう一度やっておく。類語を抽出できるようになるまでのプロセスをメモがわりに書いておく。
前半は、http://ankaji92.hatenablog.com/entry/2016/11/27/212507を参考にさせていただいた。

まず、適当なフォルダを決めて、wikiの全文を取ってくる。

$ curl https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2 -o jawiki-latest-pages-articles.xml.bz2

これを使えるように変換してまとめる。

$ git clone https://github.com/attardi/wikiextractor
$ python3 wikiextractor/WikiExtractor.py jawiki-latest-pages-articles.xml.bz2

一カテゴリずつやっていくが、辛抱強く待つ。一つのファイルにまとめる。

$ cat text/*/* > jawiki.txt

分かち書きアプリのインストール。

$ brew install mecab
$ mecab -Owakati jawiki.txt -o data.txt

前は、ここでrubyを使う方法を用いた記憶があるが、使わなくていいので、ここまでは、先の引用元にあるこの方法がいいと思う。次に、word2vecのインストールである。これについては、以下のサイトにある後半部分がc言語でやるとき便利だった。

$ git clone https://github.com/svn2github/word2vec.git
$ cd word2vec
$make

macの場合、malloc.hが無いと、叱られるので、

  • compute-accuracy.c
  • distance.c
  • word-analogy.c

について、sodlib.hに変更する。そして、再度 make。

./word2vec -train data.txt -output jawiki_wakati.bin -size 200 -window 5 -sample 1e-3 -negative 5 -hs 0 -binary 1

data.txtは、先ほど作成したパスを指定し、word2vecも作成したパスを指定して実行する。オプションについては、適宜、webを参考にする。./distanceを、今作成したjawiki_wakati.binを指定して起動する。そして、単語を入力すると、類語のリストを出してくる。

./distance jawiki_wakati.bin 
Enter word or sentence (EXIT to break): コンビニ
Word: コンビニ  Position in vocabulary: 10735
           Word                         Cosine distance
-------------------------------------------------------------
          コンビニエンスストア		0.809326
          デイリーヤマザキ			0.685043
          店舗				0.652178
          スーパーマーケット		0.636046
          ドラッグストア			0.628818
          ミニストップ			0.620285
          キオスク			0.604373
          物販				0.603765
          ブックオフ			0.599682
          直営店				0.597540
          ファミリーレストラン		0.597328
          ローソン			0.594401
          ファミリーマート			0.589032
          売店				0.588488
          ホームセンター			0.587499
          キヨスク			0.587256
          惣菜				0.574461
          出店				0.572560
          セイコーマート			0.568219
          量販				0.559042
          店				0.558693
          飲食				0.557627
          セルフサービス			0.555324
          ファストフード			0.554968
          NEWDAYS			0.554501
          以下まだつづく・・・・・・

このdistanceのjava版を作らなければならない。面倒。