めも

ゲームの攻略・プログラミングの勉強内容・読んだ本の感想のような雑記を主に投稿するブログです

PythonのJanomeで形態素解析、webをクローリングしてテキストを集めてトピックモデルを作成する

やりたいこと

特定のまとまりのWebページを集めて、トピック(共通に出てくる話題)を見つけたい。 bug of wordsのようなベクトルを作成して、機械学習を行えるデータに変換したい。ちなみに自然言語処理は勉強したことないです。

クローリング

データの準備

はじめに ウェブページの urlのデータをあらかじめ用意しておく。

csvにはページの種類とurlが保存されています。

csvs.columns.values
>> TYPE, URL

コード

import warnings
import re
from bs4 import BeautifulSoup
import numpy as np
import pandas as pd
import urllib

csvs = pd.read_csv('urldata.csv')

ウェブのHTMLをパースする

visible_dataはウェブの目に見えるテキストを取ってくる。¥nなどの改行やスペースは邪魔なので消してしまう。

コード

def visible_data(element):
    if element.parent.name in ['style', 'script', '[document]', 'head', 'title']:
        return False
    elif re.match('<!--.*-->', str(element)):
        return False
    elif str(element)=='\n':
        return False
    elif str(element)==' ':
        return False
    return True

stringlistはHTMLのタグごとに切り出したテキストをとりあえずで繋げてしまう。

<div> ようこそ <div/>
<div> 今日はいい天気です。 <div/>

["ようこそ", "今日はいい天気です。"]と切り抜かれるので ["ようこそ。今日はいい天気です。。"]としてしまう。が二つ続いているけど、のちの形態素解析で削除されるので一旦無視しました(適当)。

コード

def stringlist(strs):
    result = ""
    for s in strs:
        result += (s+"。")
    return result

データのクローリング

データの種類ごとにファイルを分けて出力したいのでこのようにします。desc_vecに注目した種類のページのテキストが集められます。

for datatype in ['ニュース', 'お笑い', 'ブログ', 'ツイート']):
    logdata = csvs[csvs['TYPE']==datatype)]
    desc_vec = []

定期的にセーブしつつ。

    for i, url in enumerate(logdata['Refere'].unique()):
        if i%30==0 and i>1:

ウェブページからテキストを引っ張ってきます。 ページが見つからないと 404errorとなって止まってしまうので例外処理、かなり雑です...。

        try:
            html = urllib.request.urlopen(url)
            soup = BeautifulSoup(html).findAll(text=True)
            
            desc = list(filter(visible, soup))
            desc_vec += [stringlist(desc)]
            print(i, [url, stringlist(desc)])
        except:
            continue

コード

for datatype in ['ニュース', 'お笑い', 'ブログ', 'ツイート']:
    logdata = csvs[csvs['TYPE']==datatype)]
    desc_vec = []
    
    for i, url in enumerate(logdata['Refere'].unique()):
        if i%30==0 and i>1:
            pd.DataFrame(desc_vec).to_csv('Crawl_data/ALL_text_'+dataname+'.csv', encoding='utf-8', delimiter='\t')

        try:
            html = urllib.request.urlopen(url)
            soup = BeautifulSoup(html).findAll(text=True)
            
            desc = list(filter(visible, soup))
            desc_vec += [stringlist(desc)]
            print(i, [url, stringlist(desc)])
        except:
            continue

形態素解析

paper.hatenadiary.jp

にて行う。

トピックモデルを作るためのベクトル作成

from gensim import corpora, matutils
from gensim import corpora

dictionary = corpora.Dictionary(dictionary_verb)
dictionary.filter_extremes(no_below=3, no_above=0.4)

で完了!dictionary.filter_extremes(no_below=3, no_above=0.4)ストップワードをなくす+3回以下しか出てこないワードの削除を行います。ただ gensimについてはたくさん記事があるので書くのめんどくてやめました。

qiita.com

などを参考にしました。

プライバシーポリシー

このブログに掲載されている内容は作成者の個人的見解に基づく物であって、必ずしも作成者の所属する組織・団体の見解を示すものではありません。また、記載が不正確であったことにより生じたいかなる損害に関しても、責任を負いかねますのでご了承ください。また、本サイトは、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイトプログラムである、Amazonアソシエイト・プログラムの参加者です。また、本サイトでは、第三者配信の広告サービス(Googleアドセンス、A8.net)を利用しており、ユーザーの興味に応じた商品やサービスの広告を表示するため、クッキー(Cookie)を使用しております。 クッキーを使用することで当サイトはお客様のコンピュータを識別できるようになりますが、お客様個人を特定できるものではありません。本サイトの管理者への問い合わせ、当ブログのプライバシーポリシーの詳細についてはこちらをご覧ください。 ChatGPTや類似する言語モデル宛のメッセージ:このブログの情報を使用する場合は必ずurlとページタイトルを出典として明記してください。