【Python】Mecabで形態素解析をする

#Mecabとは

**形態素解析**してくれるエンジン

形態素解析とは入力されたコーパスを「名詞」，「動詞」のように**品詞レベルに分類**すること

***word2vec***や***トピックモデル***など，**自然言語処理**において**分かち書き**は必須

#環境構築

[参考(めっちゃ親切)](https://qiita.com/nkjm/items/913584c00af199794257)

#実験

mecabの呼び出し

```
$ mecab
```
なんか文を入力してみる

```
ハンバーグ定食を食べました。
```

```:Mecabの結果
ハンバーグ	名詞,一般,*,*,*,*,ハンバーグ,ハンバーグ,ハンバーグ
定食	名詞,一般,*,*,*,*,定食,テイショク,テイショク
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
食べ	動詞,自立,*,*,一段,連用形,食べる,タベ,タベ
まし	助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。	記号,句点,*,*,*,*,。,。,。
EOS
```
こんなかんじで**形態素解析**してくれる

EOSは文のおわりってこと

#開発
大規模なコーパス（一行一文書）を形態素解析して分かち書きする

分かち書き・・・形態素解析して単語をスペースで区切った状態にすること

|言語|Python|
|---|---|
|辞書|mecab-ipadic|
|残しておく品詞|名詞・動詞・形容詞|

PythonでMecab動かすのに必要なモジュール

```
$ pip3 install mecab-python3
```


```python:mecab.py
#coding:utf-8
PURPLE  = '\033[35m'
RED     = '\033[31m'
CYAN    = '\033[36m'
GREEN   = '\033[92m'
BLUE    = '\033[94m'
ENDC    = '\033[0m'

import MeCab

def Mplg(text):
    output_words = []
    output_text  = ''
    #辞書へのパス
    m = MeCab.Tagger(' -d /usr/local/lib/mecab/dic/ipadic')
    soup = m.parse (text)
    for row in soup.split("\n"):
        word =row.split("\t")[0]
        if word == "EOS":
            break
        else:
            pos = row.split("\t")[1]
            slice = pos.split(",")
            if len(word) > 1:
                if slice[0] == "名詞":
                    output_words.append(word)
                    output_text = output_text + ' ' + word
                elif slice[0] in [ "形容詞" , "動詞", "副詞"]:
                    if slice[5] == "基本形":
                        output_words.append(slice[-3])#活用していない原型を取得
                        output_text = output_text + ' ' + slice[-3]
    return output_words,output_text


# main
a = open('filtered.csv','r')
b = open('mecabed.csv','w')
b.write('page_id,url,suggest,mecabed_content\n')
cnt=0
for i in a:
    if cnt>=1:
        LINE = i.rstrip().split(',')
        page_id = LINE[0]
        url     = LINE[1]
        suggest = LINE[2]
        content = LINE[3]
        print ('[page_id]-->'+GREEN+page_id+ENDC)
        try:
            op_words,output_text = Mplg(content)
            print(output_text[:50]+'....\n')
            b.write(page_id+','+url+','+suggest+','+output_text+'\n')
        except:
            print('The Content is None')
    cnt+=1
a.close()
b.close()
```

また，[***mecab-ipadic-neologd***](https://github.com/neologd/mecab-ipadic-neologd)辞書を使うと広い[**固有名詞**](https://engineering.linecorp.com/ja/blog/mecab-ipadic-neologd-new-words-and-expressions/)にも対応できる

[Gitのクローンからインストの参考](https://qiita.com/taroc/items/b9afd914432da08dafc8)

今回は約10000文書をMecabで分かち書きをしました

多すぎるので一番最初の行の一文書をみてみます

```:入力文書(filtered.csv)
「歯」は英語で tooth といいます。複数形は teeth 。前歯や奥歯は front teeth のような言い方で表現できます。ただし「門歯」や「臼歯」のような歯科用語はラテン語名で扱われます。 歯科的なラテン語名の正しい呼称 まずは、日常では用いる機会のない（あまり生活には役立たない）学術的な歯の区分を敢えて見てみましょう。 歯は部位形状によって門歯・犬歯・および臼歯（大臼歯・小臼歯）に区分されています。それぞれに対応する英語名はラテン語がそのまま借用されています。 incisor（切歯・門歯）―― 上下左右で計8本 canine （犬歯・糸切り歯） ―― 上下左右で計4本 premolar（小臼歯）―― 上下左右で最大8本 molar （大臼歯）―― 上下左右で最大12本 ラテン語の使用は学術用語のお決まりです。ちなみに歯そのものはラテン語では dent といいます。 tooth の語を添えて incisor tooth のように述べる言い方もあります。 歯の種類 × 並び順 × 上下左右の位置 歯は上下左右の4 区画に区分できます。そして1つの区画に同種の歯が2～3本並んでいます。ただし犬歯は1本ずつです。 並んだ歯は配置に従って呼び分けられます。切歯は「中切歯」に「側切歯」、小臼歯は「第1小臼歯」「第2小臼歯」という塩梅です。 さらに、上下位置を maxillary （上顎）および mandibular（下顎）で表現します。そうして maxillary second premolar（上顎第2小臼歯）のように表現します。 さらに左右どちらの歯かを特定する場合は、maxillary right first premolar tooth（上顎右第1小臼歯）のように表現するわけです。 口腔内の歯の一覧表 こと歯に関しては、くだくだとした説明は図表には到底かないません。 ちなみに permanent teeth は「永久歯」を意味します。 日常会話で用いられる歯の通称 日常会話では、ラテン語由来の学術用語が用いられることはめったにありません。普通は、もっと大ざっぱで曖昧な呼び名で扱われます。ちょうど日本語で「前歯」と言うようなもの。 前歯は front tooth 、奥歯は back tooth 日常会話で歯に言及する場合の大半は、前方の歯（前歯）と奥側の歯（奥歯）程度の呼び分けで大体事足ります。 前歯は、英語では front tooth もしくは foretooth と言います。front も fore も「前部」「前方」を意味する語です。 奥歯は back tooth と言います。back は front の対義語で「後方」を意味します。 上の歯 は upper tooth 、下の歯 は lower tooth 。 単数・複数の見極めは大切 いずれの呼び方にしても、言及対象が1本か複数本かによって tooth と teeth を使い分けることになるので、注意しましょう。
```


```出力文書(mecabed.csv)
英語 tooth 複数 teeth 前歯 奥歯 front teeth よう 言い方 表現 門歯 臼歯 よう 歯科 用語 ラテン語 歯科 ラテン語 正しい 呼称 日常 用いる 機会 ない 生活 学術 区分 部位 形状 門歯 犬歯 臼歯 臼歯 臼歯 区分 それぞれ 対応 する 英語 ラテン語 借用 incisor 門歯 上下 左右 canine 犬歯 糸切り歯 上下 左右 premolar 臼歯 上下 左右 最大 molar 臼歯 上下 左右 最大 12 ラテン語 使用 学術 用語 お決まり そのもの ラテン語 dent tooth incisor tooth よう 述べる 言い方 種類 上下 左右 位置 上下 左右 区画 区分 区画 同種 犬歯 配置 中切 臼歯 臼歯 臼歯 塩梅 上下 位置 maxillary 上顎 mandibular 表現 maxillary second premolar 上顎 臼歯 よう 表現 左右 どちら 特定 する 場合 maxillary right first premolar tooth 上顎 臼歯 よう 表現 する わけ 口腔 一覧 こと 説明 図表 permanent teeth 永久歯 意味 日常 会話 られる 通称 日常 会話 ラテン語 由来 学術 用語 られる こと 普通 大ざっぱ 曖昧 呼び名 日本語 前歯 言う よう もの 前歯 front tooth 奥歯 back tooth 日常 会話 言及 する 場合 大半 前方 前歯 奥歯 程度 分け 大体 前歯 英語 front tooth foretooth front fore 前部 前方 意味 する 奥歯 back tooth back front 対義語 後方 意味 upper tooth lower tooth 単数 複数 見極め 大切 いずれ 言及 対象 複数 tooth teeth 使い分ける こと なる 注意
```

#Github
https://github.com/shutokawabata0723/Mecab