AOKI's copy&paste archive

高専から駅弁大学から東工大を経て大企業へ 浅く広い趣味とかキャリアの日記を

形態素解析

業務の一環でWordCloudをオプションしつつ使ったのでまとめておく。
オプションとしては行動のデータを取りたかったので動詞を加えた。
とはいえ、そのままでは「する」、「ある」、「いる」や「られる」のようなノイジーな単語の頻度の高さが際立ってしまう。
言語学的には状態動詞とでも分類しようか。
そこで正規表現も流用して、平仮名のみの動詞は除いた。
厳密さはやや課題なものの、一般な動詞は漢字で表すので都合がいい。
このあたり、英語でも”kind”, "kindness"のような同じルーツの処理が気がかりだ。
しかしお向かいさんはスペース区切りが便利なため、面倒な形態素解析をわざわざやるとも思えないが。

環境整備は最後のリンクなどを参考にしてもらいたい。かなり面倒かつ環境依存性も高めなので。
特に日本語対応が面倒。

また補足的に別で用いたツイート収集も付記しておく。
ただこの手法によるツイート収集は、かなり原始的なため、APIなどを絡めたスマート化が今後の課題か。
そのAPIイーロン・マスクやらでTwitter運営がきな臭くなっていて暗雲立ち込めるが。

python code

# -*- coding: utf-8 -*-
"""
Created on Sun Mar  6 12:52:52 2022

@author: ataka
"""

import MeCab
import re
from wordcloud import WordCloud
 
FONT_PATH = "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\mpl-data\ipaexg.ttf"
TXT_NAME = "dialogue_whole"
stop_words = [""]
 
def get_word_str(text):
 
    mecab = MeCab.Tagger()
    parsed = mecab.parse(text)
    lines = parsed.split('\n')
    lines = lines[0:-2]
    word_list = []
 
    for line in lines:
        tmp = re.split('\t|,', line)
 
        if tmp[1] in ["名詞"]:
            # さらに絞り込み
            if tmp[2] in ["一般", "固有名詞"]:
                word_list.append(tmp[0])
        # elif tmp[1] in ["形容詞"]:
        #     word_list.append(tmp[0])
        elif tmp[1] in ["動詞"]:
            
            #ある、するなど普遍的な状態動詞のみを除去
            if not re.compile(r'^[あ-ん]+$').fullmatch(tmp[0]):
                word_list.append(tmp[0])
 
    return " " . join(word_list)
 

# テキストファイル読み込み
#read_text = open(TXT_NAME + ".csv", encoding = "utf-8").read()
read_text = open(TXT_NAME + ".txt", encoding = "utf-8").read()

# 文字列取得
word_str = get_word_str(read_text)
 
# 画像作成
wc = WordCloud(font_path=FONT_PATH, 
               stopwords=stop_words, 
               background_color='white', 
               width=1600,
               height=900).generate(word_str)
 
# 画像保存(テキストファイル名で)
wc.to_file(TXT_NAME + ".png")

sample output