大切なものは、見えるところに。

乳がんかな?と疑い始めてからの日々を、振り返りながら、ゆるやかに綴ります。

【wordcloud】日本語テキスト(自分が書いた乳がん検診に関する記事)をワードクラウドで可視化する際のstopword設定【python】


日本語テキストをワードクラウドで可視化してみました。
テキストは自分が書いた乳がん検診に関する記事をまとめたものです。

環境

python3 -V
Python 3.9.2

pip3 show janome
Name: Janome
Version: 0.4.2

pip3 show pandas
Name: pandas
Version: 1.4.3

pip3 show matplotlib
Name: matplotlib
Version: 3.5.3

pip3 show wordcloud
Name: wordcloud
Version: 1.8.2.2




stopword 入れる前のコード

import pandas as pd
from janome.tokenizer import Tokenizer
from janome.analyzer import Analyzer
from janome.tokenfilter import *
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
from wordcloud import WordCloud
from PIL import Image

my=open("ファイル名.txt").read()

tokenizer = Tokenizer("簡易辞書.csv", udic_type="simpledic", udic_enc="utf8")
tokens = tokenizer.tokenize(my)

corpus=[]
note=[]

for token in tokens:
    if token.part_of_speech.split(',')[0]=="名詞" or token.part_of_speech.split(',')[0]=="動詞" or token.part_of_speech.split(',')[0]=="形容詞" or token.part_of_speech.split(',')[0]=="形容動詞":
        corpus.insert(-1,token.base_form)
print(corpus)

note=" ".join(corpus)

wordcloud = WordCloud(background_color="white",
                      width=800, 
                      height=600,
                      collocations = False,
                      font_path="日本語にするためのフォントがある場所.ttf").generate(note)

fpath = '日本語にするためのフォントがある場所.ttf'
fp = FontProperties(fname=fpath, size=16)

def color_func(word, font_size, position, orientation, random_state, font_path):
    return 'darkturquoise'


#可視化

fig,ax = plt.subplots(figsize=(15,12))
ax.imshow(wordcloud)
ax.axis("off")
plt.savefig('ワードクラウド図.png', dpi=300)
plt.show()


「乳房」「凹む」は私の乳がん自覚症状です。
wordcloudはテキストで多く使われている単語が大きく表示されます。
私が記事中で何度も書いたのでしょう。「乳がん検診」の文字もありますね。


気になるのは不要な単語です。
「ある」とか「いる」とか要らない単語が多いのでstopwordを設定してみます。

wordcloudで大きく表示されている単語は出現頻度が高いものです。

単語の出現頻度を調べるため、テキスト中の単語をカウントしてみました。

カウントするためのコード

# Janomeを使うための宣言 
from janome.tokenizer import Tokenizer
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
import japanize_matplotlib

fp = open("ファイル名.txt","r")

text = fp.read()

# Janomeの準備 --- (*2)
tok = Tokenizer("/home/mikaishii917/bc/ekubo/listfuku1.csv", udic_type="simpledic", udic_enc="utf8")
tokens = tok.tokenize(text)


# 形態素をカウント --- (*3)
counter = {}
for t in tokens:
    bf = t.base_form
    if not bf in counter: counter[bf] = 0
    counter[bf] += 1

# カウントの多い順に並び替える --- (*4)
sc = sorted(counter.items(), key=lambda x: x[1], reverse=True)
# 並び替えたものを表示 --- (*5)
memo=[]
for i, t in enumerate(sc):
    if i >= 500: break
    key, cnt = t
    print((i + 1), ".", key, "=", cnt)
    note = key, cnt
    memo.append(note)
    
print(memo)    


df1=pd.DataFrame(memo)
df1.columns=["word","count"]

print(df1)

df1.to_csv('カウント出力.csv')



[('、', 118), ('。', 85), ('\n', 74), ('の', 61), ('に', 52), ('ます', 48), ('た', 46), ('て', 44), ('が', 44), ('は', 38), ('を', 37), ('です', 31), ('する', 27), ('と', 25), ('も', 23), ('いる', 21), ('ない', 18), ('で', 17), ('凹む', 14), ('乳房', 14), ('ある', 13), ('乳がん検診', 12), ('乳がん', 11), ('こと', 11), ('できる', 11), ('私', 10), ('なる', 10), ('左乳房', 10), ('だ', 10), ('から', 10), ('ん', 10), ('\n ', 10),・・・・

この中から、不要と思われる単語をstopwordに設定してみます。


stopwordを入れた後のコード

import pandas as pd
from janome.tokenizer import Tokenizer
from janome.analyzer import Analyzer
from janome.tokenfilter import *
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
from wordcloud import WordCloud
from PIL import Image

my=open("ファイル名.txt").read()

tokenizer = Tokenizer("簡易辞書.csv", udic_type="simpledic", udic_enc="utf8")
tokens = tokenizer.tokenize(my)

corpus=[]
note=[]

for token in tokens:
    if token.part_of_speech.split(',')[0]=="名詞" or token.part_of_speech.split(',')[0]=="動詞" or token.part_of_speech.split(',')[0]=="形容詞" or token.part_of_speech.split(',')[0]=="形容動詞":
        corpus.insert(-1,token.base_form)
print(corpus)

note=" ".join(corpus)
stop_words = ["、","。","の","に","ます","た","て","が","は","を","です","する","と","も","いる","ない","で","ある","こと","できる","なる","だ","から","ん","いる","ある"]

wordcloud = WordCloud(background_color="white",
                      width=800, 
                      height=600,
                      stopwords=set(stop_words),
                      collocations = False,
                      font_path="日本語にするためのフォントがある場所.ttf").generate(note)

fpath = '日本語にするためのフォントがある場所.ttf'
fp = FontProperties(fname=fpath, size=16)

def color_func(word, font_size, position, orientation, random_state, font_path):
    return 'darkturquoise'


#可視化

fig,ax = plt.subplots(figsize=(15,12))
ax.imshow(wordcloud)
ax.axis("off")
plt.savefig('ワードクラウド図.png', dpi=300)
plt.show()



stopwordを設定したほうがテキストの内容が把握しやすくなりました。
「乳房」「凹む」が一大事だった事がなんとなくわかります。

自分用にstopwordをためていくのもいいですね。