MeCabはよく使われている形態素解析器ですが,Swiftで開発するiOSアプリに導入する方法についての情報は少なかったので導入までの手順を紹介します.
MeCabを使おうとする前に
MeCabをローカルで動作させる最大の問題点はディクショナリのサイズが大きいことです.例えば,新語に強いというmecab-ipadic-NEologdは900MB近くあるので,これを使ってアプリを作ったところアプリのサイズは1GBを超えてしまいました.
単に単語に分解したいだけの場合は標準のNaturalLanguageフレームワークを使うこともできます.なお,NSLinguisticTaggerはNaturalLanguageに置き換えられDeprecatedになっています.
単語の品詞を知ることが目的の場合には上記の方法では間に合いません.その場合はMeCab等を使うことになりますが,まずはクラウドサービス等を検討するのが良いでしょう.筆者が今回のシステムでローカルのMeCabを採用した理由は以下の通りです.
- クラウドの利用料を払いたくない
- そこまで多くのユーザへの展開を考えていない
- 膨大な文を分析する必要があり通信に時間をかけたくない
- センシティブなデータを入力して解析するため生データをエッジにとどめたい
- 単語の分析自体が目的のアプリなのでユーザの理解を得られる
1. MeCabのインストール
https://github.com/landonepps/mecab
からSwift Package Managerでmecabをインストールします.このrepositoryのReadmeに書いてある通りですが以下でも説明します.
-
SPMのインストール
-
Targets -> General -> Frameworks, Libraries, and Embedded Contentに追加し
Embed & Sign
を選択.この操作はReadmeにありませんでしたが忘れているとエラーになりました.
-
mecabrc
ファイルをプロジェクトのルートに追加.ファイルの中見は下の感じ.セミコロンはコメントだと思うので実質dicdir = ./
だけあればいいかも.
;
; Configuration file of MeCab
;
; $Id: mecabrc.in,v 1.3 2006/05/29 15:36:08 taku-ku Exp $;
;
dicdir = ./
; userdic = /home/foo/bar/user.dic
; output-format-type = wakati
; input-buffer-size = 8192
; node-format = %m\n
; bos-format = %S\n
; eos-format = EOS\n
辞書の追加
辞書はmacなどでMeCabを動かすときと同じ物を使えます.macでMeCabが動くならどこかに辞書フォルダがあるはずなのでそれをコピーするだけでOKです.改めて辞書を作る場合はこちらを参照してください.辞書の生成方法と辞書のインストール先の探し方について記述がありました.
Swiftラッパーの追加
ここまでの要領で追加したMeCabはC++のライブラリでありSwiftからいじるのは少々面倒です.そこでSwiftのラッパーが必要になります.
この辺りのプログラムについても前述ライブラリの作者がデモ( https://github.com/landonepps/MecabDemo )を用意しているので参考にします.ラッパーと言っても3つのファイルだけなので以下をコピーします.
- MeCabDemo/Tokenizer 以下のファイル
- MeCabDemo/Collection+SafeSubscript.swift
構文解析のコード
以下のコードで構文解析を実行できます。
let tokenizer = Tokenizer()
let tokens = tokenizer.parse("すもももももももものうち")
print(tokens)