読者です 読者をやめる 読者になる 読者になる

ゆるふわめも

in Kyoto or Tokyo

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

などを参考にしました。