【Python】Mecabを用いたわかち書き・形態素解析実践|自然言語処理入門

当ページには広告が含まれています。

こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!

こんな方におすすめ!
  • Pythonによる自然言語処理に興味がある
  • Mecabを用いたわかち書き・形態素解析方法が知りたい
目次

自然言語処理とは?

自然言語処理(Natural Language Processing)とは、コンピュータを主体とした、自然言語(我々が日常的に会話や読み書きに使用している言語)を処理する技術を指します。

自然言語処理の目的は、コンピュータに自然言語を処理・解析させ、その解析結果を我々の日常生活・業務・学術的研究に応用することです。例えば、自然言語処理を施したデータは上図のように活用されます。

【参考】自然言語処理の学習におすすめの教材

Pythonによる自然言語処理について詳しく学びたい方向けに、厳選したおすすめ教材も紹介しています。併せてご覧ください。

あわせて読みたい
自然言語処理(NLP)学習におすすめ入門本・動画教材8選|Pythonによる機械学習・ディープラーニング向け... 「自然言語処理の概要とそれを実装するPythonプログラミング手法を学びたい」「機械学習・AIを組み合わせたモデル開発手法を知りたい」このような要望にお答えします。

Mecabとは

Mecabは、日本語の形態素解析が可能なオープンソースライブラリです。

形態素解析とは、日本語の文を形態素(最小の意味を持つ言葉の単位)に分割し、それぞれの品詞や活用形などを判別することです。Mecabは、日本語の形態素解析を高速かつ正確に行うことができる特徴があります。

Mecabはオープンソースであり、多くのプログラムやアプリケーションで利用されています。具体的には、自然言語処理、機械翻訳、情報検索、テキストマイニングなどの分野で広く利用されています。

【参考】わかち書きと形態素解析

わかち書きとは、テキスト文章を単語に分解することを指します。

Mecabは分を単語に分解するだけでなく、各単語の品詞や読みなどの情報を付与することが可能です。このような品詞情報の付与まで含んだわかち書きを形態素解析と呼びます。

【事前準備】Mecab自然言語処理用のPython環境構築

Mecabを用いて自然言語処理を行うに際し、Python環境に次のようなライブラリをインストールする必要があります。以下、コマンドプロンプト(Windows)やターミナル(MacOS)を開き、事前に実行しておきましょう。

unidic-lite

pip install unidic-lite

mecab-python3

pip install mecab-python3

【Python】Mecabを用いた自然言語処理実践|形態素解析

それでは実際にPythonのMecabライブラリを用いた形態素解析を実践します。1つずつ機能をみていきましょう。

品詞分解

文章を単語に分割した情報および品詞情報を出力する場合、次のように記述します。

コード

import MeCab

# ================================================
# 言語処理
# ================================================

# テキスト
text   = "私の好きな食べ物は赤いりんごです。"

# Mecab 形態素解析
tagger = MeCab.Tagger()

# ================================================
# 出力
# ================================================

# 品詞分解
print(tagger.parse(text))

出力結果

指定の単語抽出

分割した指定の単語のみを抽出する場合、次のように記述できます。

コード

import MeCab

# ================================================
# 言語処理
# ================================================

# テキスト
text   = "私の好きな食べ物は赤いりんごです。"

# Mecab 形態素解析
tagger = MeCab.Tagger()

# Nodeオブジェクト
node   = tagger.parseToNode(text)

# ================================================
# 出力
# ================================================

# 単語抽出(1番目)
print(node.surface)

# 単語抽出(2番目)
print(node.next.surface)

# 単語抽出(3番目)
print(node.next.next.surface)

# 単語抽出(4番目)
print(node.next.next.next.surface)

# 単語抽出(5番目)
print(node.next.next.next.next.surface)

# 単語抽出(6番目)
print(node.next.next.next.next.next.surface)

出力結果

# 
# 私
# の
# 好き
# な
# 食べ物

指定の品詞情報抽出

分割した指定の単語に紐づく品詞情報のみを抽出する場合、次のように記述できます。

コード

import MeCab

# ================================================
# 言語処理
# ================================================

# テキスト
text   = "私の好きな食べ物は赤いりんごです。"

# Mecab 形態素解析
tagger = MeCab.Tagger()

# Nodeオブジェクト
node   = tagger.parseToNode(text)

# ================================================
# 出力
# ================================================

# 品詞情報抽出(1番目)
print(node.feature)

# 品詞情報抽出(2番目)
print(node.next.feature)

# 品詞情報抽出(3番目)
print(node.next.next.feature)

# 品詞情報抽出(4番目)
print(node.next.next.next.feature)

# 品詞情報抽出(5番目)
print(node.next.next.next.next.feature)

# 品詞情報抽出(6番目)
print(node.next.next.next.next.next.feature)

出力結果

# BOS/EOS,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*
# 代名詞,*,*,*,*,*,ワタクシ,私-代名詞,私,ワタクシ,私,ワタクシ,和,*,*,*,*,ワタクシ,ワタクシ,ワタクシ,ワタクシ,*,*,0,*,*
# 助詞,格助詞,*,*,*,*,ノ,の,の,ノ,の,ノ,和,*,*,*,*,ノ,ノ,ノ,ノ,*,*,*,名詞%F1,*
# 形状詞,一般,*,*,*,*,スキ,好き,好き,スキ,好き,スキ,和,ス濁,基本形,*,*,スキ,スキ,スキ,スキ,*,*,2,C4,*
# 助動詞,*,*,*,助動詞-ダ,連体形-一般,ダ,だ,な,ナ,だ,ダ,和,*,*,*,*,ナ,ダ,ナ,ダ,*,*,*,名詞%F1,*
# 名詞,普通名詞,一般,*,*,*,タベモノ,食べ物,食べ物,タベモノ,食べ物,タベモノ,和,*,*,*,*,タベモノ,タベモノ,タベモノ,タベモノ,*,*,"2,3",C1,*

繰り返し構文を用いた単語抽出

文章から分割した単語を繰り返し構文を用い、リスト型で出力すると使い勝手が良いです。以下のように実行します。

コード

# テキスト
text   = "私の好きな食べ物は赤いりんごです。"

# Mecab 形態素解析
tagger = MeCab.Tagger()

# Nodeオブジェクト
node   = tagger.parseToNode(text)

# ループによる単語抽出
while node:
    print(node.surface)
    node = node.next

出力結果

# 
# 私
# の
# 好き
# な
# 食べ物
# は
# 赤い
# りんご
# です
# 。

わかち書き関数の作成

最後に、テキスト文章をインプットとし、分割した単語リストを出力するわかち書き関数を作成します。

コード(関数)

import MeCab

# ================================================
# わかち書き関数作成
# ================================================

# Mecab 形態素解析
tagger = MeCab.Tagger()

def tokenize(text):
    # Nodeオブジェクト
    node = tagger.parseToNode(text)
    # 品詞分解
    tokens_list = []
    
    # ループで品詞分解結果をそれぞれ取得
    while node:
        # BOS/EOS以外の結果をAppend
        if node.surface != "":
            tokens_list.append(node.surface)
        # 次の単語へ更新
        node = node.next
        
    return tokens_list

コード(関数実行)+出力結果

# ================================================
# 関数実行
# ================================================

# テキスト情報
text   = "日本の首都は東京です。"

# 関数実行
tokenize(text)

# ================================================
# 出力結果
# ================================================

# ['日本', 'の', '首都', 'は', '東京', 'です', '。']

【参考】AI・機械学習における配信情報まとめ

当サイトではAI・機械学習における「基礎」から「最新のプログラミング手法」に至るまで幅広く解説しております。また「おすすめの勉強方法」をはじめ、副業・転職・フリーランスとして始める「AI・機械学習案件の探し方」についても詳しく言及しています。

【仕事探し】副業・転職・フリーランス

【教育】おすすめ勉強法

【参考】記事一覧

最後に

この記事が気に入ったら
フォローしてね!

目次