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


目次

1 形態素解析とは
2 環境
3 Janome
 3-1 Janomeとは
 3-2 インストール
 3-3 ソースコード
 3-4 実行結果
4 MeCab
 4-1 MeCabとは
 4-2 ソースコード
 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を使用します。

3 Janome

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

3-1 Janomeとは

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

3-2 インストール

!pip install janome

3-3 ソースコード

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 ソースコード

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', '年', 'から', '国際', '連合', 'に', '加盟', 'し', 'て', 'おり', '、', '国連', '中心', '主義', 'を', '採っ', 'て', 'いる', '。']