【MeCab】文章を単語に分割する

この記事では、文章を単語に分割する方法について紹介します。

文章を単語に分割するのは形態素解析とも呼ばれていまして、文章を分析する上で欠かせない技術でもあります。

Pythonのライブラリである「MeCab」を使うと簡単に形態素解析ができます。

単語に分割するだけでなく、単語の品詞(動詞、名詞、接続詞)まで判別してくれる優れものです。

準備

Ubuntu18.04にMeCabを入れて、Pythonでコーディングしていきます。

形態素解析を行うMeCabをUbuntuにインストールします。その後に、neologdという単語の辞書をインストールします。

この辞書があると、最近のトレンドの単語、例えば、2018年の流行語大賞である「災害級の暑さ」を1つの固有名詞として解釈してくれます。

・mecabをインストール
sudo apt install mecab
sudo apt install libmecab-dev
sudo apt install mecab-ipadic-utf8

・neologdをインストール
git clone https://github.com/neologd/mecab-ipadic-neologd.git
cd mecab-ipadic-neologd
sudo bin/install-mecab-ipadic-neologd

・設定ファイルを変更
sudo vim /etc/mecabrc
# 以下を設定
dicdir = /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd

・Python3で動かせるようにする(pipではエラーが出たので、pip3推奨)
sudo apt install python3-pip
sudo pip3 install mecab-python3

Pythonでmecabを使うためのmecab-python3をインストールします。

名詞と動詞を取り出す

使う準備が出来たところで、文章中の名詞と動詞を取り出してみましょう。

import MeCab

mt = MeCab.Tagger("mecabrc")
str_in="私は今日ラーメンと餃子を食べた。とても満足した。恋ダンスの音楽が流れていた。災害級の暑さだ。"
res = mt.parseToNode(str_in)

meisi=[]
dousi=[]
while res:
    arr = res.feature.split(",")
    if (arr[0] == "名詞"):
        #名詞を取り出す
        meisi.append(arr[6])
    
    elif (arr[0] == "動詞"):
        #動詞の原型を取り出す
        dousi.append(arr[6])
        
    res = res.next

print("名詞 : {}".format(meisi))
print("動詞 : {}".format(dousi))

分割した単語の品詞が分かるので、名詞か動詞かで判別します。

実行すると以下のような結果になります。

名詞 : ['私', '今日', 'ラーメン', '餃子', '満足', '恋ダンス', '音楽', '災害級の暑さ']
動詞 : ['食べる', 'する', '流れる', 'いる']

「恋」と「ダンス」、「災害級」と「暑さ」が分割されなかったのを見ると定期的に辞書が更新されているのが分かりますね。

固有名詞を取り出す

固有名詞の説明は以下の通り。

同一の部類に属する個々の事物を他と区別するために、それぞれに与えられる特有の名称。 たとえば人名、地名、国名、団体名、商品名の類で、文法的には名詞の一類として扱われる。

つまり、地名などの特有の名称ってことですね。これをコードで自動抽出してみます。

mt = MeCab.Tagger("mecabrc")
str_in="今日は新幹線ひかりで浜松までいき、うなぎを食べ、浜名湖パルパルで遊んだ。"
res = mt.parseToNode(str_in)

meisi=[]
k_meisi=[]

while res:
    arr = res.feature.split(",")
    if (arr[0] == "名詞"):
        meisi.append(arr[6])
        if(arr[1] == "固有名詞"):
            k_meisi.append(arr[6])
    res = res.next

print("名詞 : {}".format(meisi))
print("固有名詞 : {}".format(k_meisi))

実行結果は以下の通り。

名詞 : ['今日', '新幹線', 'ひかり', '浜松', 'うなぎ', '浜名湖パルパル']
固有名詞 : ['ひかり', '浜松', '浜名湖パルパル']

‘今日’、’新幹線’、’うなぎ’は、固有名詞ではありませんが、新幹線の名前や地名は固有名詞です。

ABOUTこの記事をかいた人

個人アプリ開発者。Python、Swift、Unityのことを発信します。月間2.5万PVブログ運営。 Twitter:@yamagablog