# 7.8.12. `TokenMecab`

## 7.8.12.1. 概要

`TokenMecab` は MeCab 形態素解析器をベースにしたトークナイザーです。

MeCabは日本語に依存していません。その言語用の辞書を用意すれば日本語以外でもMeCabを使えます。日本語用の辞書には NAIST Japanese Dictionary を使えます。

`TokenMecab` を使うには、追加のパッケージをインストールする必要があります。追加のパッケージをインストールする方法の詳細については、 インストール を参照して下さい。

`TokenMecab` は再現率より適合率に優れています。 TokenBigram では `京都` というクエリーで `東京都` も `京都` も見つかりますが、この場合は `東京都` は期待した結果ではありません。 `TokenMecab` を使うと `京都` というクエリーで `京都` だけを見つけられます。

新語をサポートしたい場合は、MeCabの辞書を更新し続ける必要があります。これはメンテナンスコストがかかります。（ TokenBigram には辞書のメンテナンスコストはありません。なぜなら、 TokenBigram は辞書を使っていないからです。）新語への対応に mecab-ipadic-NEologd : Neologism dictionary for MeCab が役に立つかもしれません。

## 7.8.12.2. 構文

`TokenMecab` は、省略可能な引数があります。

オプションなし:

    TokenMecab

オプション指定:

    TokenMecab("include_class", true)

    TokenMecab("target_class", "a_part_of_speech")

    TokenMecab("include_reading", true)

    TokenMecab("include_form", true)

    TokenMecab("use_reading", true)

複数のオプション指定:

    TokenMecab("target_class", "名詞", "include_reading", true)

上記のように、 `TokenMecab` は複数のオプションを指定することもできます。上記の例以外にも複数のオプションを組み合わせて指定できます。

## 7.8.12.3. 使い方

## 7.8.12.4. 簡単な使い方

以下は `TokenMeCab` の例です。 `東京都` は `東京` と `都` にトークナイズされています。 `京都` というトークンはありません。

実行例:

    tokenize TokenMecab "東京都"
    # [
    #   [
    #     0,
    #     1545812631.661493,
    #     0.0002415180206298828
    #   ],
    #   [
    #     {
    #       "value": "東京",
    #       "position": 0,
    #       "force_prefix": false,
    #       "force_prefix_search": false
    #     },
    #     {
    #       "value": "都",
    #       "position": 1,
    #       "force_prefix": false,
    #       "force_prefix_search": false
    #     }
    #   ]
    # ]

`TokenMecab` はオプションを指定することもできます。`TokenMecab` は、`target_class` オプション、 `include_class` オプション、 `include_reading` オプション、 `include_form` オプションと `use_reading` オプションがあります。

`target_class` オプションは、指定した品詞のトークンを検索します。例えば、以下のように名詞のみを検索できます。

実行例:

    tokenize 'TokenMecab("target_class", "名詞")' '彼の名前は山田さんのはずです。'
    # [
    #   [
    #     0,
    #     1545810238.195525,
    #     0.0003066062927246094
    #   ],
    #   [
    #     {
    #       "value": "彼",
    #       "position": 0,
    #       "force_prefix": false,
    #       "force_prefix_search": false
    #     },
    #     {
    #       "value": "名前",
    #       "position": 1,
    #       "force_prefix": false,
    #       "force_prefix_search": false
    #     },
    #     {
    #       "value": "山田",
    #       "position": 2,
    #       "force_prefix": false,
    #       "force_prefix_search": false
    #     },
    #     {
    #       "value": "さん",
    #       "position": 3,
    #       "force_prefix": false,
    #       "force_prefix_search": false
    #     },
    #     {
    #       "value": "はず",
    #       "position": 4,
    #       "force_prefix": false,
    #       "force_prefix_search": false
    #     }
    #   ]
    # ]

`include_class` オプションは、以下のようにMeCabのメタデータの品詞と品詞細分類を出力します。

実行例:

    tokenize 'TokenMecab("include_class", true)' '彼の名前は山田さんのはずです。'
    # [
    #   [
    #     0,
    #     1545892715.887472,
    #     0.03757452964782715
    #   ],
    #   [
    #     {
    #       "value": "彼",
    #       "position": 0,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "class": "名詞",
    #         "subclass0": "代名詞",
    #         "subclass1": "一般"
    #       }
    #     },
    #     {
    #       "value": "の",
    #       "position": 1,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "class": "助詞",
    #         "subclass0": "連体化"
    #       }
    #     },
    #     {
    #       "value": "名前",
    #       "position": 2,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "class": "名詞",
    #         "subclass0": "一般"
    #       }
    #     },
    #     {
    #       "value": "は",
    #       "position": 3,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "class": "助詞",
    #         "subclass0": "係助詞"
    #       }
    #     },
    #     {
    #       "value": "山田",
    #       "position": 4,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "class": "名詞",
    #         "subclass0": "固有名詞",
    #         "subclass1": "人名",
    #         "subclass2": "姓"
    #       }
    #     },
    #     {
    #       "value": "さん",
    #       "position": 5,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "class": "名詞",
    #         "subclass0": "接尾",
    #         "subclass1": "人名"
    #       }
    #     },
    #     {
    #       "value": "の",
    #       "position": 6,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "class": "助詞",
    #         "subclass0": "連体化"
    #       }
    #     },
    #     {
    #       "value": "はず",
    #       "position": 7,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "class": "名詞",
    #         "subclass0": "非自立",
    #         "subclass1": "一般"
    #       }
    #     },
    #     {
    #       "value": "です",
    #       "position": 8,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "class": "助動詞"
    #       }
    #     },
    #     {
    #       "value": "。",
    #       "position": 9,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "class": "記号",
    #         "subclass0": "句点"
    #       }
    #     }
    #   ]
    # ]

このオプションで出力する品詞と品詞細分類と `target_class` で不要なトークンを取り除くことができます。

`include_reading` は以下のように、MeCabのメタデータの読みを出力します。

実行例:

    tokenize 'TokenMecab("include_reading", true)' '彼の名前は山田さんのはずです。'
    # [
    #   [
    #     0,
    #     1545892913.226588,
    #     0.0003414154052734375
    #   ],
    #   [
    #     {
    #       "value": "彼",
    #       "position": 0,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "reading": "カレ"
    #       }
    #     },
    #     {
    #       "value": "の",
    #       "position": 1,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "reading": "ノ"
    #       }
    #     },
    #     {
    #       "value": "名前",
    #       "position": 2,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "reading": "ナマエ"
    #       }
    #     },
    #     {
    #       "value": "は",
    #       "position": 3,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "reading": "ハ"
    #       }
    #     },
    #     {
    #       "value": "山田",
    #       "position": 4,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "reading": "ヤマダ"
    #       }
    #     },
    #     {
    #       "value": "さん",
    #       "position": 5,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "reading": "サン"
    #       }
    #     },
    #     {
    #       "value": "の",
    #       "position": 6,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "reading": "ノ"
    #       }
    #     },
    #     {
    #       "value": "はず",
    #       "position": 7,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "reading": "ハズ"
    #       }
    #     },
    #     {
    #       "value": "です",
    #       "position": 8,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "reading": "デス"
    #       }
    #     },
    #     {
    #       "value": "。",
    #       "position": 9,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "reading": "。"
    #       }
    #     }
    #   ]
    # ]

このオプションを使って、トークンの読みを取得できます。

`include_form` は、以下のようにMeCabのメタデータの活用型と活用形を出力します。

実行例:

    tokenize 'TokenMecab("include_form", true)' '彼の名前は山田さんのはずです。'
    # [
    #   [
    #     0,
    #     1545892987.209944,
    #     0.0004286766052246094
    #   ],
    #   [
    #     {
    #       "value": "彼",
    #       "position": 0,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "base_form": "彼"
    #       }
    #     },
    #     {
    #       "value": "の",
    #       "position": 1,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "base_form": "の"
    #       }
    #     },
    #     {
    #       "value": "名前",
    #       "position": 2,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "base_form": "名前"
    #       }
    #     },
    #     {
    #       "value": "は",
    #       "position": 3,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "base_form": "は"
    #       }
    #     },
    #     {
    #       "value": "山田",
    #       "position": 4,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "base_form": "山田"
    #       }
    #     },
    #     {
    #       "value": "さん",
    #       "position": 5,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "base_form": "さん"
    #       }
    #     },
    #     {
    #       "value": "の",
    #       "position": 6,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "base_form": "の"
    #       }
    #     },
    #     {
    #       "value": "はず",
    #       "position": 7,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "base_form": "はず"
    #       }
    #     },
    #     {
    #       "value": "です",
    #       "position": 8,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "inflected_type": "特殊・デス",
    #         "inflected_form": "基本形",
    #         "base_form": "です"
    #       }
    #     },
    #     {
    #       "value": "。",
    #       "position": 9,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "base_form": "。"
    #       }
    #     }
    #   ]
    # ]

`use_reading` は、読みがなによる検索をサポートします。このオプションは、読みがなを使った検索をするため、表記ゆれの対策として有用です。

実行例:

    tokenize 'TokenMecab("use_reading", true)' '彼の名前は山田さんのはずです。'
    # [
    #   [
    #     0,
    #     1545893087.556662,
    #     0.0003693103790283203
    #   ],
    #   [
    #     {
    #       "value": "カレ",
    #       "position": 0,
    #       "force_prefix": false,
    #       "force_prefix_search": false
    #     },
    #     {
    #       "value": "ノ",
    #       "position": 1,
    #       "force_prefix": false,
    #       "force_prefix_search": false
    #     },
    #     {
    #       "value": "ナマエ",
    #       "position": 2,
    #       "force_prefix": false,
    #       "force_prefix_search": false
    #     },
    #     {
    #       "value": "ハ",
    #       "position": 3,
    #       "force_prefix": false,
    #       "force_prefix_search": false
    #     },
    #     {
    #       "value": "ヤマダ",
    #       "position": 4,
    #       "force_prefix": false,
    #       "force_prefix_search": false
    #     },
    #     {
    #       "value": "サン",
    #       "position": 5,
    #       "force_prefix": false,
    #       "force_prefix_search": false
    #     },
    #     {
    #       "value": "ノ",
    #       "position": 6,
    #       "force_prefix": false,
    #       "force_prefix_search": false
    #     },
    #     {
    #       "value": "ハズ",
    #       "position": 7,
    #       "force_prefix": false,
    #       "force_prefix_search": false
    #     },
    #     {
    #       "value": "デス",
    #       "position": 8,
    #       "force_prefix": false,
    #       "force_prefix_search": false
    #     },
    #     {
    #       "value": "。",
    #       "position": 9,
    #       "force_prefix": false,
    #       "force_prefix_search": false
    #     }
    #   ]
    # ]

## 7.8.12.5. 高度な使い方

`target_class` オプションは、品詞細分類を指定することや、 + や - を使って、特定の品詞を追加または、除外することもできます。したがって、以下のように人名の接尾語と非自立語を除いた名詞を検索することもできます。

このようにして、ノイズとなるトークンを除外して検索できます。

実行例:

    tokenize 'TokenMecab("target_class", "-名詞/非自立", "target_class", "-名詞/接尾/人名", "target_class", "名詞")' '彼の名前は山田さんのはずです。'
    # [
    #   [
    #     0,
    #     1545810363.771334,
    #     0.0003197193145751953
    #   ],
    #   [
    #     {
    #       "value": "彼",
    #       "position": 0,
    #       "force_prefix": false,
    #       "force_prefix_search": false
    #     },
    #     {
    #       "value": "名前",
    #       "position": 1,
    #       "force_prefix": false,
    #       "force_prefix_search": false
    #     },
    #     {
    #       "value": "山田",
    #       "position": 2,
    #       "force_prefix": false,
    #       "force_prefix_search": false
    #     }
    #   ]
    # ]

加えて、以下のように `include_reading` を使って、ノイズを除去したトークンの読みを取得できます。

実行例:

    tokenize 'TokenMecab("target_class", "-名詞/非自立", "target_class", "-名詞/接尾/人名", "target_class", "名詞", "include_reading", true)' '彼の名前は山田さんのはずです。'
    # [
    #   [
    #     0,
    #     1545893197.914959,
    #     0.0003139972686767578
    #   ],
    #   [
    #     {
    #       "value": "彼",
    #       "position": 0,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "reading": "カレ"
    #       }
    #     },
    #     {
    #       "value": "名前",
    #       "position": 1,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "reading": "ナマエ"
    #       }
    #     },
    #     {
    #       "value": "山田",
    #       "position": 2,
    #       "force_prefix": false,
    #       "force_prefix_search": false,
    #       "metadata": {
    #         "reading": "ヤマダ"
    #       }
    #     }
    #   ]
    # ]

## 7.8.12.6. 引数

### 7.8.12.6.1. 省略可能引数

省略可能引数は4つあります。 `include_class` 、 `target_class` 、 `include_form` と `use_reading` です。

#### 7.8.12.6.1.1. `include_class`

MeCabのメタデータの品詞と品詞細分類を出力します。

#### 7.8.12.6.1.2. `target_class`

指定した品詞のトークンを出力します。

#### 7.8.12.6.1.3. `include_reading`

MeCabのメタデータの読みを出力します。

#### 7.8.12.6.1.4. `include_form`

MeCabのメタデータの活用型と活用形を出力します。

#### 7.8.12.6.1.5. `use_reading`

トークンの読みを出力します。

## 7.8.12.7. 参考

- tokenize