LoginSignup
6
2

More than 1 year has passed since last update.

Colab上でのMecabユーザ辞書登録

Posted at

はじめに:

  • Mecabは日本語のNLPにおける形態素解析のツールです。
  • 形態素解析とは、文章を形態素の列に分割し、それぞれの形態素の品詞等を判別する作業です。
    • 例として、
      頑張りをしっかり反映。
      に対して、形態素解析を行うと以下のように分割されます。
      頑張り / を / しっかり / 反映 / 。
  • しかし、Mecab上に登録されている辞書データでは、分割されたくないが分割されてしまうような単語(形態素)も出現します。
  • したがって、ここでは分割されてほしくない単語をMecabの辞書内にユーザ辞書として新規登録する方法を示します。
  • 環境としては、Google Colablatory下での実行を想定しています。
    • 理由として、Google Colab下でのMecabを使用した文献が少なかったことと、文献が存在してもエラーが発生するため、備忘録的に残したかったからです。

ユーザ辞書の形式

  • Mecabのユーザ辞書はcsvファイルで、各列は以下のフォーマットで解釈されます。
*.csv
表層形,左文脈ID,右文脈ID,コスト,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用型,活用形,原形,読み,発音

例)
工藤,1223,1223,6058,名詞,固有名詞,人名,名,*,*,くどう,クドウ,クドウ
  • 左文脈ID,右文脈ID,コストとは公式では以下のように定義されていました。

左文脈IDは, その単語を左から見たときの内部状態IDです.
空にしておくと mecab-dict-index が自動的に ID を付与します.

右文脈IDは, その単語を右から見たときの内部状態IDです.
空にしておくと, mecab-dict-index が自動的に ID を付与します.

コストは,その単語がどれだけ出現しやすいかを示しています. 小さいほど, 出現しやすいという意味になります.
似たような単語と 同じスコアを割り振り, その単位で切り出せない場合は, 徐々に小さくしていけばいいと思います.

  • 上の 太字 の箇所では空にしておけばよいと記述されていますが、実際にはエラーが起きたので何かしら適当な値を入れておく必要がありそうです。

    • ここでは、形態素での分割のみを目的としているので、IDには100、コストには1と、適当な値を設定しました。
  • したがって、まずは単語を上記のフォーマットにエンコードするコードを以下のように定義します。

  • 以下のクラス定義では、出力したいcsvファイルのパスと、単語をリスト形式で格納した変数をパラメータとして必要とします。

    • 他にも、品詞やコストなどのパラメータをセッティングすることもできます。
import csv
class MakeMecabCSV:
    """ Mecabのユーザ辞書の書式でcsvを作成するクラス """
    def __init__(self, csvfile_path, word_list):
        self.csvfile_path = csvfile_path
        self.word_list = word_list
        self.cost = '1'
        self.wclass = '名詞'
        self.wclass1 = '固有名詞'

    # fileモードを指定して、word_listをcsvに一括書き出し
    def makecsv_list(self, fmode='w'):
        with open(self.csvfile_path, fmode, newline='', encoding='utf-8') as f:
            writer = csv.writer(f)
            for word in self.word_list:
                # 表層形,左文脈ID,右文脈ID,コスト,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用型,活用形,原形,読み,発音
                writer.writerow([word,'100','100','1','名詞','固有名詞','*','*','*','*','*','*','*','mydic'])

    # 追加登録メソッド用のセッター
    def set_param(self, cost='10', wclass='名詞', wclass1='固有名詞'):
        self.cost = cost
        self.wclass = wclass
        self.wclass1 = wclass1

    # 1単語ずつの追加登録メソッド
    def makecsv_word(self, word):
        with open(self.csvfile_path , 'a', newline='', encoding='utf-8') as f:
            writer = csv.writer(f)
            writer.writerow([word,'100','100',self.cost,self.wclass,self.wclass1,'*','*','*','*','*','*','*','mydic'])

Mecabユーザ辞書への追加

  • 前節でcsvファイルを得たら、colabのセル上で以下のコマンドを順次実行していきます。

  • まず、colab上でmecabと辞書のインストールを行います。

!apt-get -q -y install sudo file mecab libmecab-dev mecab-ipadic-utf8 git curl python-mecab > /dev/null
!git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git > /dev/null 
!echo yes | mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n > /dev/null 2>&1
!pip install mecab-python3 > /dev/null
!ln -s /etc/mecabrc /usr/local/etc/mecabrc
  • ユーザ辞書用のディレクトリを作成します。
!mkdir ../var/lib/mecab/dic/userdic
  • mecab-dict-indexを用いて辞書のコンパイルを行います。
    • 各引数の意味は以下の通りです。
-d <システム辞書が入っているディレクトリ> \
-u <ユーザ辞書の保存先> \
-f <CSVファイルの文字コード> \
-t <ユーザ辞書の文字コード> <CSVファイル>
!/usr/lib/mecab/mecab-dict-index \
-d /usr/share/mecab/dic/ipadic/ \
-u /content/userdic.dic \
-f utf-8 \
-t utf-8 "/content/drive/MyDrive/Colab Notebooks/<追加csvファイル名>"

# -tのcsvファイルのパスは環境に合わせて適宜変更してください。
# -dを
# -d /var/lib/mecab/dic/debian \
# と設定している文献もありましたが、debian下にはrewrite.defが存在しないためエラーが発生
  • 出力が以下のようになれば問題ありません。
reading /content/drive/MyDrive/ColabNotebooks/<追加csvファイル名> ... <登録単語数>
emitting double-array: 100% |###########################################| 

done!
  • mecabrc(設定ファイル)にユーザ辞書のパスを追記します。
!echo "userdic = /content/userdic.dic" >> /etc/mecabrc
  • 以上で設定は完了です。
  • ユーザ辞書登録を行った単語を含めて実際に形態素解析を行うと、分かち書きされないことが確認できるかと思います。

参考URL

以下のサイトを参考にさせていただきました。
- Mecabユーザ辞書への単語追加
- MeCab: 単語の追加方法
- mecab github

6
2
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
6
2