COTOHAは方言がわかるのか

AI

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

[自然言語処理] COTOHAにおける方言と出身地の相関関係 - Qiita
記念すべきQiita初投稿。 AIに関して学習し始めて3日目です。面白そうなAPIを見つけたので試してみました。 目的 NTTコミュニケーションズが開発している自然言語処理技術であるCOTOHA APIの属性推定(β) APIを...

目的

NTTコミュニケーションズが開発している自然言語処理技術である、 COTOHA APIユーザ属性推定(β) ではリクエストした文章から出身地(location)を推定することができます。 私は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では方言から出身地を特定することはできませんでした。

リクエストした文章が短すぎたのかもしれませんが、明らかに標準語でないものは関東以外の出身地にしてほしかったなと思います。

次回、機会があればもっと長文の方言を用いた文章で検証してみたいです。

広告

フリーランスエンジニアを目指すあなたに!

サポートが充実したコミュニティと仕事をご用意【Freeto】

・これからフリーランスに転向したいと考えている方
・フリーランスとして働いているが報酬や仕事内容に満足していない方
・自分の実力をより発揮できる仕事がしたい方

一人では解決できないこともあるのではないでしょうか。
安定した仕事から将来のキャリアプランまで、
フリーランスの方の一生涯をサポートしていきます。

フリーランス同士のコミュニティの場、Freetoはこちら

レンタル・シェアオフィス・バーチャルオフィス を探しているあなたに!

賃貸を探すような感覚で【レンタル・バーチャル・シェアオフィス】が探せるハブスペ
あなたにぴったりのオフィスが簡単に見つかる!

★★ハブスペ3つのメリット★★
・値段やエリアなどの必要条件でシェアオフィス・バーチャルオフィス・レンタルオフィスを検索し内見申込み、問い合わせができる。
・Googleのレビュー・口コミ・料金を比較して選べる
・ハブスペ経由でのオフィス契約者全員にAmazonギフト券をプレゼント!

最近では、オフィスも特徴があり
女性・主婦向けオフィス、
学童保育付きオフィス
夜だけ安く使えるオフィス
高級路線のオフィス
など様々です。ぜひあなたにぴったりのオフィスを見つけてください!

詳細はこちら

コメント

タイトルとURLをコピーしました