この記事をアップデートしたものをQiitaへ投稿しました。

[自然言語処理] COTOHAにおける方言と出身地の相関関係 - Qiita
記念すべきQiita初投稿。
AIに関して学習し始めて3日目です。面白そうなAPIを見つけたので試してみました。
目的
NTTコミュニケーションズが開発している自然言語処理技術であるCOTOHA APIの属性推定(β) APIを...
目的
NTTコミュニケーションズが開発している自然言語処理技術である、 COTOHA API のユーザ属性推定(β) ではリクエストした文章から出身地(location)を推定することができます。 私はCOTOHAがこの出身地を判断する基準として、リクエストした文章中の方言でどこの出身なのかを判断していると考えました。そこで、今回は日本列島の地域ごとの方言を用意し、APIにリクエストし、レスポンスとしてどのような出身地がリターンされるのかを検証します。
方法
まずは以下のように各地域ごとに代表的な方言をピックアップし例文をインターネットから探し集めました。
地域ごとの方言
地域 | 方言 | 例文 | 標準語 |
北海道 | 北海道弁 | この座布団あづましくないね | この座布団、あまり座り心地が良くないね |
東北 | 津軽弁 | そこにいるわらし | そこにいる小学生 |
関東 | 栃木弁 | こないだいきあったね | 先日偶然会ったね |
中部 | 愛知弁 | 机をつっといて | 机を運んどいて |
近畿 | 大阪弁 | けったいな格好してはる | 変な格好している |
中国 | 広島弁 | 明日、数学のテストじゃ。たいぎい。 | 明日、数学のテストだ。めんどくさい。 |
四国 | 土佐弁 | あの店はラーメン屋に変わったにかあらん | あの店はラーメン屋にかわったらしい |
九州 | 博多弁 | これはペンですたい | これはペンです |
沖縄 | 沖縄弁 | なんくるないさ | 何とかなるさ |
参考サイト
北海道弁、津軽弁、栃木弁、愛知弁、大阪弁、広島弁、土佐弁、博多弁、沖縄弁
ソースコード
今回利用したクエリはこちらを参考にしています。
pythonを使ってCOTOHA apiをコールしています。
# reference https://qiita.com/gossy5454/items/83072418fb0c5f3e269f
import os
import urllib.request
import json
import configparser
import codecs
# COTOHA API操作用クラス
class CotohaApi:
# 初期化
def __init__(self, client_id, client_secret, developer_api_base_url, access_token_publish_url):
self.client_id = client_id
self.client_secret = client_secret
self.developer_api_base_url = developer_api_base_url
self.access_token_publish_url = access_token_publish_url
self.getAccessToken()
# アクセストークン取得
def getAccessToken(self):
# アクセストークン取得URL指定
url = self.access_token_publish_url
# ヘッダ指定
headers={
"Content-Type": "application/json;charset=UTF-8"
}
# リクエストボディ指定
data = {
"grantType": "client_credentials",
"clientId": self.client_id,
"clientSecret": self.client_secret
}
# リクエストボディ指定をJSONにエンコード
data = json.dumps(data).encode()
# リクエスト生成
req = urllib.request.Request(url, data, headers)
# リクエストを送信し、レスポンスを受信
res = urllib.request.urlopen(req)
# レスポンスボディ取得
res_body = res.read()
# レスポンスボディをJSONからデコード
res_body = json.loads(res_body)
# レスポンスボディからアクセストークンを取得
self.access_token = res_body["access_token"]
# ユーザ属性推定API
def userAttribute(self, document):
# ユーザ属性推定API URL指定
url = self.developer_api_base_url + "nlp/beta/user_attribute"
# ヘッダ指定
headers={
"Authorization": "Bearer " + self.access_token,
"Content-Type": "application/json;charset=UTF-8",
}
# リクエストボディ指定
data = {
"document": document
}
# リクエストボディ指定をJSONにエンコード
data = json.dumps(data).encode()
# リクエスト生成
req = urllib.request.Request(url, data, headers)
# リクエストを送信し、レスポンスを受信
try:
res = urllib.request.urlopen(req)
# リクエストでエラーが発生した場合の処理
except urllib.request.HTTPError as e:
# ステータスコードが401 Unauthorizedならアクセストークンを取得し直して再リクエスト
if e.code == 401:
print ("get access token")
self.access_token = getAccessToken(self.client_id, self.client_secret)
headers["Authorization"] = "Bearer " + self.access_token
req = urllib.request.Request(url, data, headers)
res = urllib.request.urlopen(req)
# 401以外のエラーなら原因を表示
else:
print ("<Error> " + e.reason)
# レスポンスボディ取得
res_body = res.read()
# レスポンスボディをJSONからデコード
res_body = json.loads(res_body)
# レスポンスボディから解析結果を取得
return res_body
if __name__ == '__main__':
# ソースファイルの場所取得
APP_ROOT = os.path.dirname(os.path.abspath( __file__)) + "/"
# 設定値取得
config = configparser.ConfigParser()
config.read(APP_ROOT + "config.ini")
CLIENT_ID = config.get("COTOHA API", "Developer Client id")
CLIENT_SECRET = config.get("COTOHA API", "Developer Client secret")
DEVELOPER_API_BASE_URL = config.get("COTOHA API", "Developer API Base URL")
ACCESS_TOKEN_PUBLISH_URL = config.get("COTOHA API", "Access Token Publish URL")
# COTOHA APIインスタンス生成
cotoha_api = CotohaApi(CLIENT_ID, CLIENT_SECRET, DEVELOPER_API_BASE_URL, ACCESS_TOKEN_PUBLISH_URL)
# 解析対象文
sentence = "この座布団あづましくないね "
# API実行
result = cotoha_api.userAttribute(sentence)
# 出力結果を見やすく整形
result_formated = json.dumps(result, indent=4, separators=(',', ': '))
print (codecs.decode(result_formated, 'unicode-escape'))
結果
文章ごとの結果
北海道(北海道弁)
{
"result": {
"age": "20-29歳",
"hobby": [
"COOKING",
"INTERNET",
"MOVIE"
],
"location": "関東",
"moving": [
"WALKING"
],
"occupation": "会社員"
},
"status": 0,
"message": "OK"
}
東北(津軽弁)
{
"result": {
"age": "20-29歳",
"civilstatus": "未婚",
"earnings": "-1M",
"hobby": [
"GOURMET",
"INTERNET",
"MOVIE",
"TRAVEL"
],
"location": "関東",
"moving": [
"RAILWAY",
"WALKING"
],
"occupation": "会社員"
},
"status": 0,
"message": "OK"
}
関東(栃木弁)
{
"result": {
"earnings": "-1M",
"hobby": [
"GOURMET",
"INTERNET",
"MOVIE",
"SHOPPING"
],
"location": "関東",
"occupation": "会社員"
},
"status": 0,
"message": "OK"
}
中部(愛知弁)
{
"result": {
"age": "20-29歳",
"hobby": [
"COOKING",
"INTERNET",
"MOVIE",
"SHOPPING"
],
"location": "近畿",
"moving": [
"RAILWAY"
],
"occupation": "会社員"
},
"status": 0,
"message": "OK"
}
近畿(大阪弁)
{
"result": {
"age": "40-49歳",
"earnings": "-1M",
"hobby": [
"INTERNET",
"MOVIE",
"TRAVEL"
],
"location": "関東",
"moving": [
"RAILWAY",
"WALKING"
],
"occupation": "会社員"
},
"status": 0,
"message": "OK"
}
中部(広島弁)
{
"result": {
"age": "20-29歳",
"civilstatus": "未婚",
"earnings": "-1M",
"hobby": [
"INTERNET",
"MOVIE"
],
"location": "関東",
"occupation": "会社員"
},
"status": 0,
"message": "OK"
}
四国(土佐弁)
{
"result": {
"civilstatus": "既婚",
"hobby": [
"COOKING",
"GOURMET",
"INTERNET",
"MOVIE",
"MUSIC",
"SHOPPING",
"TRAVEL"
],
"location": "関東",
"occupation": "会社員"
},
"status": 0,
"message": "OK"
}
九州(博多弁)
{
"result": {
"age": "40-49歳",
"gender": "男性",
"hobby": [
"CAMERA",
"COOKING",
"GOURMET",
"INTERNET",
"MOVIE",
"SHOPPING",
"TRAVEL"
],
"location": "関東",
"moving": [
"RAILWAY"
],
"occupation": "会社員"
},
"status": 0,
}
沖縄(沖縄弁)
{
"result": {
"age": "40-49歳",
"location": "関東",
"occupation": "会社員"
},
"status": 0,
"message": "OK"
}
答え合わせ
地域 | 方言 | COTOHAの回答 | 正誤 |
北海道 | 北海道弁 | 関東 | ✖ |
東北 | 津軽弁 | 関東 | ✖ |
関東 | 栃木弁 | 関東 | 〇 |
中部 | 愛知弁 | 近畿 | △ |
近畿 | 大阪弁 | 関東 | ✖ |
中国 | 広島弁 | 関東 | ✖ |
四国 | 土佐弁 | 関東 | ✖ |
九州 | 博多弁 | 関東 | ✖ |
沖縄 | 沖縄弁 | 関東 | ✖ |
9問中1問正解
愛知弁は近畿と判断されおしい結果だったので△としました。
まとめ
今回の検証でCOTOHAでは方言から出身地を特定することはできませんでした。
リクエストした文章が短すぎたのかもしれませんが、明らかに標準語でないものは関東以外の出身地にしてほしかったなと思います。
次回、機会があればもっと長文の方言を用いた文章で検証してみたいです。
コメント