2017年10月22日日曜日

【Python】芥川龍之介の『鼻』からワードクラウドを作ってみる

nose

 『Pythonによるクローラー&スクレイピング入門 設計・開発から収集データの解析・運用まで』P283~を参考にして芥川龍之介の『鼻』のテキストから上のようなワードクラウドを作成してみました。
 書籍掲載のものは形態素解析にJanomeを使用していますが、今回はMeCabで行っています。辞書はipadic-neologdを使用。
 また、名詞、副詞、動詞、形容詞のみ抽出し、動詞・形容詞は基礎型に変換しています。


import requests
import MeCab
from bs4 import BeautifulSoup
from wordcloud import WordCloud
import matplotlib.pyplot as plt


def get_wordcloud(text, file_path):
    '''
    :param text, file_path: str
    :return:
    '''

    # ストップワードの設定。出力結果を見ながら手動で設定した。
    stop_words = ["ある", "ない", "いる", "する", "の", "よう", "なる", "それ", "そこ", "これ", "こう", "ため", "そう", "れる", "られる"]

    # 単語に分割し名詞、副詞、動詞、形容詞のみ抽出(動詞・形容詞は基礎型を取得)
    tagger = MeCab.Tagger('-Ochasen')
    pos1 = ("名詞", "副詞")  # 表層形を取得する品詞
    pos2 = ("動詞", "形容詞")  # 基礎形を取得する品詞
    node = tagger.parseToNode(text)
    words = []
    while node:
        features = node.feature.split(",")
        if (features[0] in pos1) and not (node.surface in stop_words):
            words.append(node.surface)
        elif (features[0] in pos2) and not (features[6] in stop_words):
            words.append(features[6])
        node = node.next

    # wordcloudオブジェクトの作成
    font_path = r"C:\WINDOWS\Fonts\SourceHanSerif-SemiBold.otf"
    wordcloud = WordCloud(background_color="white", font_path=font_path, width=1600, height=1066, regexp=r"\w+").generate(" ".join(words))

    # wordcloudファイル出力
    wordcloud.to_file(file_path)

    # wordcloud表示
    plt.imshow(wordcloud, interpolation="bilinear")
    plt.axis("off")
    plt.show()


if __name__ == '__main__':
    # 青空文庫からテキストの取得
    url = "http://www.aozora.gr.jp/cards/000879/files/42_15228.html"  # 芥川龍之介 『鼻』
    r = requests.get(url, timeout=10)
    soup = BeautifulSoup(r.content, "lxml")

    # 本文の抽出
    text_elm = soup.find("div", attrs={"class": "main_text"})

    # ルビの削除
    [e.extract() for e in text_elm.select("rt")]
    text = text_elm.text

    # wordcloudの作成
    file_path = r"D:\nose.png"  # 出力する画像ファイルのパス
    get_wordcloud(text, file_path)

0 件のコメント: