GridDBによるTwitter感情分析 – Part 1

はじめに

特定のトピックに対するユーザーの意見を追跡するために、日々生成される膨大なテキストデータにおける感情を把握する必要が生じることがあります。また、特定の地域の感情の値を可視化することで、企業の意思決定に役立てることができます。このブログでは、ツイートデータセットをGridDBにロードし、データセットの感情の分析を行い、matplotlibを使って可視化する方法を紹介します。

前提条件

GridDBインスタンスとpython3、matplotlib、pandasを用いて、感情の計算と視覚化を行います。ツイートデータセットは、2013年から2018年までのラナプラザに関するツイートをウェブスクレイピングして得られたものです。

データセット・スキーマ

2013年、バングラデシュで発生したラナプラザビルの崩壊により、1100人以上のファッション関係者が亡くなり、ZARA、H&M、Gap、Benettonなどの大手ファッションブランドのイメージが悪化しました。これらのファッションブランドに対して消費者がどのような反応を示したのかを調べるために、2013年から2018年にかけて発信されたラナプラザに関するツイートに対して感情分析を行います。GridDBコンテナで使用するエクセルデータセットファイルの属性は以下のように設定します。

Field Name Data Type(GridDB) Notes
Serial No INTEGER
Screen Name STRING Twitter Author Name
Twitter ID STRING Twitter handle
Tweet STRING Tweet text
Date STRING

データを抽出する

エクセルファイル(.xlsx)を読み込んで各行を繰り返し処理し、pandasを使ってデータフレームに格納します。データセットのエクセルファイルには複数のシートが含まれているので、各シートを繰り返し処理する必要があることに注意してください。以下は、pandasを使ってサンプルデータセットを読み込むためのコードスニペットです。

import pandas as pd
import xlrd

list_sheetnames = pd.ExcelFile("sample_dataset.xls").sheet_names
total_num_sheets = len(list_sheetnames)

for i in range(total_num_sheets):
    sheet_read = pd.read_excel("sample_dataset.xls", list_sheetnames[i])
    tweet_data_df = pd.DataFrame(sheet_read)
    print(tweet_data_df[:5])

さらに、サンプルのエクセルファイルのすべての列を取得し、リストの形で保存します。

tweets_list = sheet_read["Tweet"].values.tolist()
tweet_date_list = sheet_read["Date"].values.tolist()
tweet_author_names_list = sheet_read["Screen Name"].values.tolist()
tweet_author_handle_list = sheet_read["Twitter Id"].values.tolist()
print(tweet_author_handle_list[:5])

コードスニペットの出力は次のようになります。

/Users/vj/PycharmProjects/sentiment_analysis_blogs/venv/bin/python /Users/vj/PycharmProjects/sentiment_analysis_blogs/main.py
['VicUnions', 'ituc', 'shopjanery', 'EthicalBrandMkt', 'CattyDerry']
['Vic Trades Hall\u200f\xa0', 'ITUC\u200f\xa0', 'Jane Pearson\u200f\xa0', 'Ethical Brand Marketing\u200f\xa0', 'CATTY DERRY\u200f\xa0']

Process finished with exit code 0

次のステップでは、感情分析を効果的に実行できるように、データのクリーニングと前処理を行います。センチメント分析を効果的に行うためには、リンクや特殊文字を削除してツイートテキストをクリーンアップする必要があります。

# a function to clean the tweets using regular expression
def clean_tweet(tweet):
    '''
    Utility function to clean the text in a tweet by removing
    links and special characters using regex.
    '''
    return ' '.join(re.sub("(@[A-Za-z0-9]+)|([^0-9A-Za-z \t])|(\w+:\/\/\S+)", " ", tweet).split())

** GridDBコンテナにデータを挿入する**

データフレームに格納されたデータを、putまたはmulti-putメソッドを使用してGridDBコンテナにフィードします。データを格納するためのGridDBコンテナを作成し、各コンテナにはサンプルデータセットの対応するシート名のデータを格納します。

factory = griddb.StoreFactory.get_instance()

# Get GridStore object
# Provide the necessary arguments
gridstore = factory.get_store(
    host=argv[1],
    port=int(argv[2]),
    cluster_name=argv[3],
    username=argv[4],
    password=argv[5]
)

curr_sheet_griddb_container = curr_sheet

# create collection for the tweet data in the sheet
tweet_data_container_info = griddb.ContainerInfo(circuits_container,
                                                [["sno", griddb.Type.INTEGER],
                                                    ["twitter_name", griddb.Type.STRING],
                                                    ["twitter_id", griddb.Type.STRING],
                                                    ["tweet", griddb.Type.STRING],
                                                    ["date", griddb.Type.STRING]],
                                                griddb.ContainerType.COLLECTION, True)

tweets_columns = gridstore.put_container(tweet_data_container_info)

次のステップでは、put_rows関数を使ってデータフレームを行に挿入します。

# Put rows
# Pass the data frames as param
tweets_columns.put_rows(tweet_data_df)

データを前処理した後、与えられたデータセットスキーマのGridDBコレクションにデータを挿入することができました。

コンテナからデータを取得する

get_containerメソッドを使ってデータを取得し、そのコレクションを照会してデータを抽出します。

# Define the container names
tweet_dataaset_container = excel_sheet_name

# Get the containers
tweet_data = gridstore.get_container(tweet_dataaset_container)

# Fetch all rows - tweet_container
query = tweet_data.query("select *")
rs = query.fetch(False)
print(f"{tweet_dataaset_container} Data")

# Iterate and create a list
retrieved_data = []
while rs.has_next():
    data = rs.next()
    retrieved_data.append(data)

print(retrieved_data)

# Convert the list to a pandas data frame
tweet_dataframe = pd.DataFrame(retrieved_data,
                                    columns=['sno', 'twitter_name', 'twitter_id', 'tweet', 'date'])

# Get the data frame details
print(tweet_dataframe)
tweet_dataframe.info()

このクエリで、データセットに含まれる2013年から2018年までのすべてのツイートデータを取得します。これは、ツイートデータコンテナから行全体を選択する基本的なTQL文です。

query = tweet_data.query("select *")

適当なクエリを渡して、ある条件でデータを取得することができます。さらに、そのリストをデータフレームにマッピングすることもできます。

まとめ

今回のブログのパート1では、エクセルファイルから感情分析用のツイートデータを前処理する方法について説明しました。さらに、GridDBコンテナを使用してコレクションを作成し、全体にクエリをかけて必要な属性を抽出しました。

ソースコード

GitHub

ブログの内容について疑問や質問がある場合は Q&A サイトである Stack Overflow に質問を投稿しましょう。 GridDB 開発者やエンジニアから速やかな回答が得られるようにするためにも "griddb" タグをつけることをお忘れなく。 https://stackoverflow.com/questions/ask?tags=griddb

Leave a Reply

Your email address will not be published. Required fields are marked *