LoginSignup
3
3

More than 1 year has passed since last update.

SwiftでMeCabを使う方法

Posted at

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 -> Build Phases -> Link BinaryWith Librariesに追加する.
    スクリーンショット 2022-05-19 6.35.09.png

  • Targets -> General -> Frameworks, Libraries, and Embedded Contentに追加しEmbed & Signを選択.この操作はReadmeにありませんでしたが忘れているとエラーになりました.
    スクリーンショット 2022-05-19 6.37.20.png

  • mecabrcファイルをプロジェクトのルートに追加.ファイルの中見は下の感じ.セミコロンはコメントだと思うので実質dicdir = ./だけあればいいかも.
    スクリーンショット 2022-05-19 6.39.34.png

mecabrc
;
; 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です.改めて辞書を作る場合はこちらを参照してください.辞書の生成方法と辞書のインストール先の探し方について記述がありました.

スクリーンショット 2022-05-19 6.42.51.png

スクリーンショット 2022-05-19 6.43.31.png

Swiftラッパーの追加

ここまでの要領で追加したMeCabはC++のライブラリでありSwiftからいじるのは少々面倒です.そこでSwiftのラッパーが必要になります.

この辺りのプログラムについても前述ライブラリの作者がデモ( https://github.com/landonepps/MecabDemo )を用意しているので参考にします.ラッパーと言っても3つのファイルだけなので以下をコピーします.

  • MeCabDemo/Tokenizer 以下のファイル
  • MeCabDemo/Collection+SafeSubscript.swift

構文解析のコード

以下のコードで構文解析を実行できます。

sample.swift
let tokenizer = Tokenizer()
let tokens = tokenizer.parse("すもももももももものうち")
print(tokens)

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3