見出し画像

【Python】形態素解析エンジンMeCabをPythonでやってみた。 せっかくなのでパーソルP&T社長メッセージから単語を出現数順に抽出してみたよ。

みなさん、こんにちは!
今回の記事は、ライター今田が担当します。

以前noteに、自然言語処理とは?という記事があがっていまして、今回は自然言語処理を行う過程の形態素解析の簡単な実装について記事にしました!

オープンソース形態素解析エンジンMeCabをPythonでどのように実装するか、インストールからパーソルP&T社長メッセージ単語出現数順に抽出するところまでを通じてやってみようと思います!
※形態素とは、意味を有する言語単位のことです。


1. MeCabについてとインストール

MeCabとは、オープンソース形態素解析エンジンで、スクリプト言語(Perl, Ruby, Python, Java)から利用可能です。


PythonでMeCabを使用するために、mecab-python3というPythonラッパーをインストールします。
以下サイトにならって、コマンドを実行するだけでインストールできます。

#インストール
pip install mecab-python3

#辞書インストール
pip install unidic-lite

これで準備OKです。


2. 基本的な使い方

基本的な使い方も先ほどのサイトにならって実行してみます。

import MeCab
wakati = MeCab.Tagger("-Owakati")
wakati.parse("pythonが大好きです").split()

#実行結果

['python', 'が', '大好き', 'です']

分かち書きができました!
※分かち書きとは、文章の語の区切りに空白を挟んで記述することです。

tagger = MeCab.Tagger()
print(tagger.parse("pythonが大好きです"))

#実行結果

python python  python python   名詞-普通名詞-一般 0
が   ガ    ガ    が    助詞-格助詞
大好き ダイスキ ダイスキ 大好き  形状詞-一般 1
です  デス   デス   です   助動詞 助動詞-デス   終止形-一般
EOS

単語ごとの情報も持っていますね!


3. MeCabで単語をカウントする

単語をカウントしていくので、名詞だけ抽出したり、出現数をカウントするのに便利なparseToNodeメソッドを使用して進めていきます。
parseToNodeメソッドについては後ほどもう少し解説を加えます。

挨拶文を上記ページからコピペして、textという変数に代入します。

text = '''パーソルプロセス&テクノロジーは、人・プロセスデザイン・テクノロジーという3つの力によって\
お客様のビジネスにおける様々なプロセスを変革に導くことで、「はたらいて、笑おう。」の世界を実現してまいります。\
少子高齢化による生産労働人口減少という課題に対する解決策は、\
「はたらく人を増やすこと」と「一人ひとりの生産性を向上させていくこと」のいずれかです。\
人と仕事の適切なマッチングを通じて社会全体で適材適所を推進していくこと、女性や高齢者、外国人などの労働力を積極的に活用していくことに加え、\
テクノロジーの進化を活用しながら、業務のあり方や人と組織の関係性そのものを変えていくことが、\
今後の「仕事」や「はたらく」に対し大きな影響をもたらすことは間違いありません。\
その中で、私たちパーソルプロセス&テクノロジーは、お客様の生産性向上を徹底的に推進することを使命としています。\
AIやIoTを代表するようなテクノロジーの活用や、RPA導入を含めたコンサルティング・アウトソーシングを通じて、\
抜本的にビジネスプロセスを変革いたします。\
私たちは社会問題に正面から向き合い、社会の役に立つ会社でありたい。\
正解のない課題に対しても失敗を恐れずチャレンジしていきたいと考えています。\
パーソルプロセス&テクノロジーは、これまで以上に人・プロセスデザイン・テクノロジーの3つの力に尖りと磨きをかけ、\
お客様から選ばれ続ける企業を目指し、挑戦してまいります。'''

複数行を使用するときは、 '''を使います。

単語ごとにカウントして、出現数順に並び変えるには以下のように実装します。(あくまで一例です)

mecabTagger = MeCab.Tagger()
noun_count = {}
   
node = mecabTagger.parseToNode(text)
while node:
    word = node.surface
    hinshi = node.feature.split(",")[0]
    if word in noun_count.keys() and hinshi == "名詞":
        noun_freq = noun_count[word]
        noun_count[word] = noun_freq + 1
    elif hinshi == "名詞":
        noun_count[word] = 1
    else:
        pass
    node = node.next
    
noun_count = sorted(noun_count.items(), key=lambda x:x[1], reverse=True)
print(noun_count)

少し解説を入れますと、

node = mecabTagger.parseToNode(text)

社長メッセージの各形態素のsurface(単語)とfeature(単語が持つ品詞などの情報)の解析結果をnodeという変数に代入しています。

node.featureには、
品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用型,活用形,原形,読み,発音
といった情報がカンマ区切りのテキストで入っていて、
split(",")で分割して[0]の品詞情報を取得しています。
※以下ページの使い方あたりをご参照ください

while文で、名詞の場合は出現するごとにカウントする処理をしていて、
node = node.nextで次の形態素に移ります。

noun_count = sorted(noun_count.items(), key=lambda x:x[1], reverse=True)

単語と出現数を格納しているnoun_countの二番目の要素であるvalue(出現数)をキーとして降順に並び替える処理をここでしています。


4. 実行結果とまとめ

先ほどのコードを実行すると以下のような結果が得られます。

#実行結果

[('こと', 8),('テクノロジー', 7),('人', 5), ('プロセス', 4),
('パーソルプロセス', 3), ('客', 3), ('生産', 3), ('社会', 3), ('活用', 3),
('デザイン', 2), ('3', 2), ('力', 2), ('ビジネス', 2), ('変革', 2), ('高齢', 2),
('労働', 2), ('課題', 2), ('向上', 2), ('仕事', 2), ('推進', 2),
('世界', 1), ('実現', 1), ('少子', 1), ('人口', 1), ('減少', 1), ('解決', 1),
('策', 1), ('一人ひとり', 1), ('マッチング', 1), ('全体', 1), ('適材', 1),
('適所', 1), ('女性', 1), ('外国', 1), ('積極', 1), ('進化', 1), ('業務', 1),
('組織', 1), ('関係', 1), ('もの', 1), ('今後', 1), ('影響', 1), ('間違い', 1),
('中', 1), ('徹底', 1), ('使命', 1), ('AI', 1), ('IoT', 1), ('代表', 1), ('RPA', 1),
('導入', 1), ('コンサルティング', 1), ('アウトソーシング', 1), ('抜本', 1),
('問題', 1), ('正面', 1), ('役', 1), ('会社', 1), ('正解', 1), ('失敗', 1),
('チャレンジ', 1), ('以上', 1), ('尖り', 1), ('磨き', 1), ('企業', 1), ('挑戦', 1)]

個人的な見解ですが、テクノロジーと人が共存している雰囲気が単語から感じられますね。
失敗・チャレンジ・尖り・磨きといった単語からも、新しいテクノロジーを積極的にトライして次のステージに向かおうという姿勢も感じます。


5. 最後に

SMKT事業部では、データアナリスト・データエンジニアを募集しています。
是非こちらもご覧ください。

▽その他募集職種こちらから▽

最後までお読みいただき誠にありがとうございました!
ではまた!

●●●

✉ サービスに関するお問い合わせ
パーソルプロセス&テクノロジー SMKT事業部
smkt_markegr_note@persol-pt.co.jp


みんなにも読んでほしいですか?

オススメした記事はフォロワーのタイムラインに表示されます!