【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をためていくのもいいですね。