JanomeとMecabを使って形態素解析してみる

#目次
[1 形態素解析とは](#1-形態素解析とは)
[2 環境](#2-環境)
[3 Janome](#3-Janome)
　[3-1 Janomeとは](#3-1-Janomeとは)
　[3-2 インストール](#3-2-インストール)
　[3-3 ソースコード](#3-3-ソースコード)
　[3-4 実行結果](#3-4-実行結果)
[4 MeCab](#4-Mecab)
　[4-1 MeCabとは](#4-1-MeCabとは)
　[4-2 ソースコード](#4-2-ソースコード)
　[4-3 実行結果](#4-3-実行結果)



#1 形態素解析とは
>形態素解析とは、自然言語処理（NLP）の一部で、自然言語で書かれた文を言語上で意味を持つ最小単位(＝形態素)に分け、
それぞれの品詞や変化などを判別することです。
例えば　「庭には二羽ニワトリがいる」という文章を
庭（名詞）/に（助詞）/は（助詞）/二（数詞）/羽（助数詞）/ニワトリ（名詞）/が（助詞）/いる（動詞）
のように形態素に分解し、意味を割り出します。[^1]

要は`文章を単語ごとに区切る`というイメージです。
今回はWikipediaから持ってきた以下の文章で形態素解析を行っていきます。

>日本国（にほんこく、にっぽんこく、英: Japan）、または日本（にほん、にっぽん）は、東アジアに位置し、日本列島[注 6] および南西諸島・伊豆諸島・小笠原諸島などからなる民主制国家[1][要文献特定詳細情報][2]。首都は東京都[1][3]。
気候は四季の変化に富み、国土の多くは山地で、人口は沿岸の平野部に集中している。国内には行政区分として47の都道府県があり、日本民族[注 7]・アイヌ[注 8]・外国人系の人々[注 9]が居住し、日本語を通用する[1]。
内政においては、明治維新後の1889年に大日本帝国憲法を制定し立憲国家となった。太平洋戦争後の1947年には現行の日本国憲法を施行。外交においては、1956年から国際連合に加盟しており、国連中心主義を採っている[1]。[^2]



#2 環境
今回は[Google Colaboratory](https://colab.research.google.com/notebooks/intro.ipynb?hl=ja)を使用します。



#3 Janome
まずはJanomeを用いて形態素解析を行います。



##3-1 Janomeとは
>Janomeとは、Pythonライブラリの1つで、形態素解析をしたり分かち書きをしたりすることができる。
速度はMeCabに劣るが、導入が容易



##3-2 インストール
```
!pip install janome
```



##3-3 ソースコード
```python
from janome.tokenizer import Tokenizer
import re

# ファイルの読み込み
with open("Wikipedia-Japan.txt", mode="r", encoding="utf-8") as f:
  nihon_orig = f.read()

# 不要な部分を削除
nihon = re.sub("（[^）]+）", "", nihon_orig)
nihon = re.sub("\[[^\]]+\]", "", nihon)
nihon = re.sub("[ 　\n]", "", nihon) 

separator = "。" # 句点をセパレータに指定
nihon_list = nihon.split("。") # 各文毎に分割
nihon_list.pop() # 最後の要素は空文字列なので削除
nihon_list = [s+separator for s in nihon_list] # 各文の最後に句点を追加

tokenizer = Tokenizer() # インスタンスを生成

nihon_words = [] # 単語を格納するリスト
for s in nihon_list:
  nihon_words.append(list(tokenizer.tokenize(s, wakati=True))) # wakati=True で各単語を2次元リストとして格納

print(*nihon_words, seq="\n")

```



##3-4 実行結果
```
['日本', '国', '、', 'または', '日本', 'は', '、', '東アジア', 'に', '位置', 'し', '、', '日本', '列島', 'および', '南西諸島', '・', '伊豆諸島', '・', '小笠原諸島', 'など', 'から', 'なる', '民主', '制', '国家', '。']
['首都', 'は', '東京', '都', '。']
['気候', 'は', '四季', 'の', '変化', 'に', '富み', '、', '国土', 'の', '多く', 'は', '山地', 'で', '、', '人口', 'は', '沿岸', 'の', '平野', '部', 'に', '集中', 'し', 'て', 'いる', '。']
['国内', 'に', 'は', '行政', '区分', 'として', '47', 'の', '都道府県', 'が', 'あり', '、', '日本', '民族', '・', 'アイヌ', '・', '外国', '人', '系', 'の', '人々', 'が', '居住', 'し', '、', '日本語', 'を', '通用', 'する', '。']
['内政', 'において', 'は', '、', '明治維新', '後', 'の', '1889', '年', 'に', '大日本帝国', '憲法', 'を', '制定', 'し', '立憲', '国家', 'と', 'なっ', 'た', '。']
['太平洋戦争', '後', 'の', '1947', '年', 'に', 'は', '現行', 'の', '日本国', '憲法', 'を', '施行', '。']
['外交', 'において', 'は', '、', '1956', '年', 'から', '国際', '連合', 'に', '加盟', 'し', 'て', 'おり', '、', '国連', '中心', '主義', 'を', '採っ', 'て', 'いる', '。']
```



#4 MeCab
続いてMeCabを用いて形態素解析を行います。



##4-1 MeCabとは
>形態素解析定番のツールです。
知名度が高さに加えて、高速、高精度という特徴があります。[^3]



##4-2 インストール
```
!apt install aptitude
!aptitude install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file -y
!pip install mecab-python3==0.7
```

##4-3 ソースコード
```python
import MeCab
import re

# ファイルの読み込み
with open("Wikipedia-Japan.txt", mode="r", encoding="utf-8") as f:
  nihon_orig = f.read()

# 不要な部分を削除
nihon = re.sub("（[^）]+）", "", nihon_orig)
nihon = re.sub("\[[^\]]+\]", "", nihon)
nihon = re.sub("[ 　\n]", "", nihon) 

separator = "。" # 句点をセパレータに指定
nihon_list = nihon.split("。") # 各文毎に分割
nihon_list.pop() # 最後の要素は空文字列なので削除
nihon_list = [s+separator for s in nihon_list] # 各文の最後に句点を追加

tagger = MeCab.Tagger("-Ochasen")
tagger.parse("")

nihon_words = [] # 単語を格納するリスト
for i, s in enumerate(nihon_list):
  tmp = []
  s = tagger.parseToNode(s) #「文頭」の要素を取得
  while s:
    if not s.surface == "": # 空文字列を削除
      tmp.append(s.surface)
    s = s.next # 次のノードへ
  nihon_words.append(tmp)

print(*nihon_words, sep="\n")
```



##4-4 実行結果
```
['日本', '国', '、', 'または', '日本', 'は', '、', '東アジア', 'に', '位置', 'し', '、', '日本', '列島', 'および', '南西諸島', '・', '伊豆諸島', '・', '小笠原諸島', 'など', 'から', 'なる', '民主', '制', '国家', '。']
['首都', 'は', '東京', '都', '。']
['気候', 'は', '四季', 'の', '変化', 'に', '富み', '、', '国土', 'の', '多く', 'は', '山地', 'で', '、', '人口', 'は', '沿岸', 'の', '平野', '部', 'に', '集中', 'し', 'て', 'いる', '。']
['国内', 'に', 'は', '行政', '区分', 'として', '47', 'の', '都道府県', 'が', 'あり', '、', '日本', '民族', '・', 'アイヌ', '・', '外国', '人', '系', 'の', '人々', 'が', '居住', 'し', '、', '日本語', 'を', '通用', 'する', '。']
['内政', 'において', 'は', '、', '明治維新', '後', 'の', '1889', '年', 'に', '大日本帝国', '憲法', 'を', '制定', 'し', '立憲', '国家', 'と', 'なっ', 'た', '。']
['太平洋戦争', '後', 'の', '1947', '年', 'に', 'は', '現行', 'の', '日本国', '憲法', 'を', '施行', '。']
['外交', 'において', 'は', '、', '1956', '年', 'から', '国際', '連合', 'に', '加盟', 'し', 'て', 'おり', '、', '国連', '中心', '主義', 'を', '採っ', 'て', 'いる', '。']
```



[^1]: [Ledge.ai - 形態素解析とは | 定義・用途・3種のツールについて解説](https://ledge.ai/morpho_analysis_japan/)
[^2]: [Wikipedia - 日本](https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC)
[^3]: [Wikipedia - MeCab](https://ja.wikipedia.org/wiki/MeCab)