迷走ブログ

ファウスト的衝動を抱き、迷走している、凡人による気まぐれブログです。

【python】コーヒー豆の産地別の特徴をスクレイピングし、特徴となる言葉を見てみた

はじめに

最近、インスタントコーヒーを飲むようになったのですが、コーヒー豆には色々な産地があることを知りました。
ちなみに、僕はこちらのコーヒー(ネスカフェ ゴールドブレンド 120g)が好きです。

今回はコーヒー豆の産地として有名であるらしい情報を集めて、その豆の特徴を記述している部分を簡単に形態素解析し、コーヒー豆がどのような言葉によって表現されているのかを調べてみました。

行ったこと

ざっくりとまとめると、以下の流れで調べました。

  1. 「コーヒー」AND「産地」のような単語でググりました。
  2. 一番はじめにヒットしたAGFのサイト(コーヒー豆AtoZ コーヒー豆の種類|AGF®)を見てみました。
  3. コーヒー豆の産地がまとめられていましたので、その情報をスクレイピングしました。
  4. 形態素解析をして、頻出の単語を調べました

コードの解説

pandas で html を読み込む

import pandas as pd

url = "https://www.agf.co.jp/enjoy/cyclopedia/flow/atoz_05.html"

df = pd.read_html(url)
df

f:id:yktmmrmtoosa03:20210918235138j:plain
はじめに、pandas でサイトから直接テーブルタグ部分を読み込みました。
要はtableタグをそのままデータフレームとして読み込めば、「加工しなくていいし、楽じゃん」と考えました。しかし、そのような僕の浅はかな考えはぶち壊されました。

よく見ると[]で囲まれていることに気がつきました。そのため、リストとして返ってきてしまったのです。

そこでググると、なんでもHTMLに複数のテーブルがある場合、DataFrameがListに格納されてしまうそうなのです。
そこで対処方針として、素直にテーブルタグをスクレイピングすることに方針を変更しました。

スクレイピングし、その情報をCSVに保存

import requests
from bs4 import BeautifulSoup
import pandas as pd

#Webページを取得して解析する
load_url = "https://www.agf.co.jp/enjoy/cyclopedia/flow/atoz_05.html"
html = requests.get(load_url)
soup = BeautifulSoup(html.content, "html.parser")

# tableタグを指定して、中身を取り出す
table = soup.find_all("table")
df = pd.read_html(str(table))[0]

#データをCSV形式で保存する
df.to_csv("産地別のコーヒーの特徴.csv",encoding="utf-8")

次に、スクレイピングをしました。
ここでは、上述のサイトのテーブルタグを特定し、そこから中身を取り出す作業をしています。

そのために、「find_all()」で全てのテーブルタグを取得しています。
その上で、pandasの「read_html」で、テーブルの情報を読み込みました。

最後に、出力した内容をCSV形式でファイルに保存しました。

保存したファイルを読み込む

import pandas as pd
df = pd.read_csv("産地別のコーヒーの特徴.csv",encoding="utf-8")
print(len(df))
df.head()

f:id:yktmmrmtoosa03:20210919001404j:plain
保存したファイルを読み出します。
しっかりと保存されていることが確認できました。(⌒▽⌒)

特徴部分の記述されている文字数をカウント

df["length"] = df["産地・特徴"].str.len()
df

f:id:yktmmrmtoosa03:20210919001910j:plain
僕の現時点の実力ではなんちゃって解析ですので、まずは記述部分の文字数をカウントしてみました。

色々と統計量についても確認

df["length"].describe()

f:id:yktmmrmtoosa03:20210919003249j:plain
とりあえず、記述量的には、おおよそ33くらいの文字数で表現されているようです。
また、最も記述数の少ないものは19字とのことですので、最大の44文字での記述されている箇所とは2倍くらいの差を有しているようです。筆者の熱量の入り具合が違うのでしょうかね。笑

Janomeを使って形態素解析をしてみた

from janome.tokenizer import Tokenizer
from janome.analyzer import Analyzer
from janome.tokenfilter import *

import pandas as pd
df = pd.read_csv("産地別のコーヒーの特徴.csv",encoding="utf-8")

token_filters = [POSKeepFilter(['名詞']),TokenCountFilter(sorted=True)]
a = Analyzer(token_filters=token_filters)

dada =''.join(df["産地・特徴"])
for iii in a.analyze(dada):
    print('%s:%d' % (iii))

f:id:yktmmrmtoosa03:20210919010513j:plain
ここではJanomeというモジュールを使って分析を試みています。
iPad にてpythonの勉強をしているのですが、現状、MeCabをインストールして使うことができなかったので、諦めました。
そこで、Janomeを用いています。

今回は名詞に絞って、頻出の言葉を分析してみました。
公式のドキュメントを見て探りつつ、試してみました。

意外というかなんというか、「風味」や「高級」と言った単語はあまり使われていないようでした。一方で「香り」や「上品」と言った言葉が使用されているようでした。おそらく、全体的に「高級」とまではいかないが、「上品」な味わいのものが多いということなのでは?と思いました。

ちなみに、形容詞も調べました。「甘い」「強い」という言葉が主に使用されているようです。
f:id:yktmmrmtoosa03:20210919011833j:plain

【補足】

今回は、お試し感覚で形態素解析に挑戦してみました。
そのため、そもそもの記述量が少ないものを選んでいますので、そこら辺がちょっと物足りなさと分析の不正確さをあらわにしてしまっており、反省点です。
と言っても、現時点の僕の実力ではどうしようもないので、コツコツと勉強して頑張ります。

おわりに

ああ、コーヒーのことを調べているうちに、コーヒーメーカーが欲しくなってしまった。。。どうしようか。。。