やりたいこと
特定のまとまりの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
形態素解析
にて行う。
トピックモデルを作るためのベクトル作成
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についてはたくさん記事があるので書くのめんどくてやめました。
などを参考にしました。