機械学習で日本酒をクラスタリング Part2 自然言語処理編

2016-03-14
 

「自分の好みの日本酒を機械学習で見つけよう」第2回目はレビューをmecabで分かち書きします。

レビューコメントは前回と同じようにこちらのサイトから、前回作ったsake.csvを基に銘柄ごとにスクレイピングして、review.tsvを作ります。

中身はこんな感じ

code meigara review datetime
4 鰊御殿 山田錦 4合瓶900円で安売りだったので買ってみました。あまり期待してなかったのですが、わりと普通に旨かったです。香はほどよく、アルコール感もなく飲みやすいです。ただこれといった特徴もないです。 2014-09-14 10:32:46

ソースはこちら


# -*- coding:utf-8 -*-

import urllib.request
import codecs
import csv
import html5lib

from bs4 import BeautifulSoup

f = codecs.open('review.tsv', 'w', 'utf-8')
f.write("code\tmeigara\treview\tdatetime" "\n")

csvf = open('sake.csv', 'r')

headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36'}

tpl_url='http://www.sakeno.com/meigara/{0}'
reader = csv.reader(csvf)
header = next(reader)
count = 0
for row in reader:

    url=tpl_url.format( row[0] )
    req = urllib.request.Request(url, headers = headers)
    soup = BeautifulSoup(urllib.request.urlopen(req).read(), "html5lib")
    dl = soup.find('dl', {'class':'voiceloop'})

    i = 0

    if dl is not None:
        dts = dl.findAll('dt')
        dds = dl.findAll('dd')

        for dt in dts:

            meigara = dt.findAll('a')[1].string
            review = dds[i]

            for e in review.findAll('br'):
                e.extract()

            datetime = dds[i].find('div', {'class': 'voicemember'})
            for e in datetime.findAll('a'):
                e.extract()
            datetime = datetime.text
            datetime = datetime.split("(")[1]
            datetime = datetime.split(")")[0]
            datetime = datetime.replace('年', '-')
            datetime = datetime.replace('月', '-')
            datetime = datetime.replace('日', '')
            datetime = datetime.replace('時', ':')
            datetime = datetime.replace('分', ':')
            datetime = datetime.replace('秒', '')

            for e in review.findAll('div'):
                e.extract()
            review = review.text
            review = review.replace("\n", ' ')

            i += 1

            print(row[0],meigara,review,datetime)
            f.write(row[0] + "\t" + meigara + "\t"+ review +"\t"+ datetime + "\n")

f.close()
csvf.close()

こちらのreview.tsvのレビューコメントをmecabで分かち書きします。

その際に、お酒の銘柄名もちゃんと分かち書きされるようにmecabに辞書登録します。

インケンのマシンだとこんな感じ


$ /usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index -d /usr/local/lib/mecab/dic/ipadic -u /usr/local/lib/mecab/dic/sake.dic -f utf8 -t utf8 ~/Documents/sake/sake_mecab.csv

$ vi /usr/local/etc/mecabrc #以下を追加
userdic = /usr/local/lib/mecab/dic/sake.dic

mecabの日本酒辞書はこちら