Pythonでいろいろやってみる

Pythonを使った画像処理や機械学習などの簡単なプログラムを載せています。

自民党総裁選候補者の主張から頻出単語を抽出し図示する

自民党総裁選候補者4人の主張から頻出単語を抽出し図示します。出てくる名詞を出現回数順にランク付けし出現回数の多い単語を強調して図示することで各候補者の主張を浮かび上がらせます。
テキストファイルに保存した候補者の主張・政策を形態素解析Janomeにて形態素解析し名詞を取り出します。そこから出現頻度の高い名詞20個を取り出し各候補者のキーワードとして図示します。その際、出現頻度が高い単語ほどフォントサイズを大きくし色もはっきりさせます。

関連記事

Janomeで形態素解析して形態素を登場回数順に並べる
Yahooニュース・アクセスランキングの見出しを取得し頻出単語を調べる

環境
  • windows10 home
  • jupyter notebook 6.3.0
  • Python 3.8.8
  • Janome 0.4.1
  • Pillow 8.2.0
準備

下記の自民党総裁選各候補者の個人サイトより政策部分のテキストをコピーしテキストファイルに文字コードutf-8で保存しました(kishida.txt, takaichi.txt, kono.txt, noda.txt)。
岸田文雄 総裁選特設サイト
高市早苗 総裁選特設サイト
河野太郎 総裁選特設サイト
野田聖子 オフィシャルサイト 政策について

コード

関数keywordではテキストファイル読み出し・形態素解析・キーワードの抽出を行っています。関数outputでキーワードのサイズや色の調整・描画位置の設定・図の描画を行います。

from janome.tokenizer import Tokenizer
import collections  
import math
import random
from PIL import Image, ImageDraw, ImageFont

# テキストファイルを読み出し登場回数の多い名詞を20個抽出する関数
def keyword(filename):
   
    f = open(filename, 'r', encoding='UTF-8')
    text = f.read()
    f.close()

    noun_list=[] 
    t = Tokenizer()

    # 形態素解析を行い、名詞のみを取得しnoun_listに加える
    for token in t.tokenize(text):
        text_split = str(token).split()[1]
        words = str(text_split).split(',')[0]   
        if words == '名詞':   
            noun = str(token).split()[0]  
            noun_list.append(noun)  

    # noun_listのカウント結果を登場回数の多い順に20個取得        
    noun_count = collections.Counter(noun_list)
    list_best = noun_count.most_common(20)
    word = [i[0] for i in list_best]
    number = list(range(20))
    list_best_word = list(zip(word, number))
    return(list_best_word)

# 各候補者のテキストファイルを関数keywordへ入れて結果を取得
kishida = keyword('kishida.txt')
takaichi = keyword('takaichi.txt')
kono = keyword('kono.txt')
noda = keyword('noda.txt')

# 各候補者のキーワード抽出の結果を図にする。登場回数の多い単語を大きく濃く表す
def output(candidate, keywords, x0, y0):

    font = ImageFont.truetype('C:\Windows\Fonts\meiryo.ttc', int(24))
    draw.multiline_text((x0, y0), candidate, fill=(0, 0, 0), font=font)
    # キーワードと登場回数の順位の組をシャッフル    
    random.shuffle(keywords)
    
    # 単語の描画。登場回数順位の高い単語ほど大きく黒い字で描画する
    for i in range(20):  
        row = i%4
        column = math.ceil((i+1)/4)
        word = keywords[i][0]
        number = keywords[i][1]
        font = ImageFont.truetype('C:\Windows\Fonts\meiryo.ttc', int(24-number/2))
        draw.multiline_text((x0+70*row, y0+20+25*column), word, fill=(0+number*4, 0+number*4, 0+number*4), font=font)

# imageオブジェクトの生成と下絵の作成
im = Image.new('RGB', (600, 400), (235, 245, 255))      
draw = ImageDraw.Draw(im) 
draw.rectangle([(10, 10), (290, 190)], fill='skyblue')
draw.rectangle([(310, 10), (590, 190)], fill='skyblue')
draw.rectangle([(10, 210), (290, 390)], fill='skyblue')
draw.rectangle([(310, 210), (590, 390)], fill='skyblue')

# 関数outputの呼び出し
output('岸田文雄', kishida, 20, 10)
output('高市早苗', takaichi, 320, 10)
output('河野太郎', kono, 20, 210)
output('野田聖子', noda, 320, 210)

# 図の保存
im.save('candidates.png', quality=95) 
実行結果

キーワードがわかりやすく図示されました。 f:id:T_A_T:20210920144310p:plain

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村