文章がどのぐらい具体的か測定したい

※ こちらは「Sansan Advent Calendar 2022」の21日目の記事です。昨日はkur0ckyさんによるマラソンではじめる効果的なKPTでした。彼が如何にマラソンと飲酒を愛しているかが伝わる熱い記事でしたね。

概要

  • 文章の具体度を定量的に測定できると、自身の文章のレビューに使える。
  • 最も簡単に試すため、単語の具体度データセットを利用し、単語ベースでの文章の具体度を測定した。
  • 単語の語彙を増やすために、単語分散表現を特徴量としてSVRで具体度を推論し、再度文章の具体度を測定した。
  • 単語の具体度推論については一定上手くいっていそうだが、文章のスコアリングは上手くいかない。ユースケースと具体的であることの定義を詰めたほうが良さそう。

初めに

説明をする際、「具体」と「抽象」を繰り返すと説得力を増すと一般的に考えられています。

例えば、「最近は家で取り組むことが出来る趣味が人気だ」というと抽象的ですが、さらに「例えばNintendo Switchは売上が好調だし、Netflixもサービスが人気で業績を伸ばしている」と加えると具体的な文章となり、説得力が増します。

この「具体」と「抽象」を自分も良い感じに使いたい、となった時、「普段の自分の説明はどの程度、抽象的 or 具体的なんだろう?」という疑問を持つでしょう。

その疑問に一定のヒントを与える方法として、文章の具体度の定量化が考えられます。 例えば、チャットツールの中で自分の説明に対して、具体度を可視化することができたら、自分の説明バランスを考え直すツールとなり得ます。

このようなサービスがあったら良いなと思いました

今回は、そのアイディアを最も簡単に行う方法として、日本語文章の具体度を単語のみで測定することを試してみます。

repo

利用したrepoはこちらです。

github.com

具体的とは?

文章が具体的である、と考えられる要素は複数あります。軽く書いてみましょう。

  • 名詞が特定のものを指している
  • 「例えば」などが使われている、指示語が少ない
  • 話を聞いて、そのイメージが想像でき、それが複数人の中でほぼ同等のイメージとなる

定義が難しいですが、今回は「名詞が特定のものを指している」に着目します。

方法

流れを下記に書きます。

  • 単語がどの程度具体的かをスコアリングする
    • スコアリングされたデータベースを用意する
    • DeepLにて英語を日本語に変換する
  • 単語を元に、文章単位でスコアリングを行う。
    • スコアリングを行う文章を用意する
    • 単語ベースでのスコアリングを行う
  • スコアリングされた単語を増やす
    • スコアリングを行う文章の名詞を抽出する
    • 単語ごとのベクトルを、日本語 Wikipedia エンティティベクトルから取得する
    • スコアリングを行う文章の名詞に対し、SVRを用いて具体度を推定
  • 再度、文章ごとのスコアリングを単語ベースで実施

それぞれ見ていきます。

単語がどの程度具体的かをスコアリングする

単語の具体性をスコアリングするための手法を説明していきます。

スコアリングされたデータベースを用意する

こちらはMedical Research Council Psycholinguistic Database(MRCDB)というデータベースの情報を利用します。

UWA Psychology: MRC Psycholinguistic Database (Dict Interface)

MRCDBには150837語が収録されており、それぞれに最大26の言語学的・心理言語学的属性が付与されています。 その中には、具象性スコア(Concreteness rating)、心像性スコア(Imagability rating)が両方紐づく単語が3011語存在します。

スコアの具体的な説明は、下記論文の記載が非常に分かりやすいため引用します。

Webページの具体度の評価と具体的なWebページのためのクエリ推薦

具象性とは視覚や聴覚などの感覚によって経験することができる度合いを示す属性であり,心像性とは心的イメージの思い浮かべやすさの度合いを示す属性である.

具象性スコアと心像性スコアには高い相関があることが同論文内で説明されており、更に単語の具体度を下記のように定義しています。

具体度の計算(論文より引用)

今回はこちらの具体度を利用します。具象性スコアと心像性スコアが100~700の値を取るため、具体度についても100~700の範囲をとる値となります。

DeepL APIにて英語を日本語に変換する

今回は、日本語の具体性を測定したいと考えています。しかしMRCDBは英語のデータベースです。そこで、DeepLのAPIを用いて日本語に変換します。「英語でスコアリングされたデータを日本語で変換してそのスコアは有用なものなのか?」という疑問は当然ありますが、今回は気にせず進めようと思います。

MRCDBは全て大文字で単語が登録されていますが、DeepLの変換時は小文字の方が変換性能が上がるため、全て小文字に変換したのちにDeepL APIによる変換を行っています。(例: MILK → milk → ミルク)

変換された単語帳をTranslated MRCDBと呼びます。 更にTranslated MRCDBについて、具象性スコア(CNC)、心像性スコア(IMG)から具体度を計算します。

具体度が上位の5単語を下記に貼ります。

具体度が上位の5単語

比較のために、具体度が下位の5単語を貼ります。

具体度が下位の5単語

確かに具体度が上位の単語の方が、視覚や聴覚で経験していたり、具体的な事物が想像しやすい経験がありそうに見えます。

単語を元に、文章単位でスコアリングを行う。

スコアリングを行う文章を用意する

今回は、名大会話コーパスの「data001.txt」を用います。

https://mmsrv.ninjal.ac.jp/nucc/nucc.html

名大会話コーパスは129会話, 合計約100時間の日本語母語話者同士の雑談を文字化したコーパスです。 「data001.txt」はファミリーレストランにおける雑談を記録したものであり、先頭部分は下記のようなものとなります。

@データ1(約35分)
@収集年月日:2001年10月16日
@場所:ファミリーレストラン
@参加者F107:女性30代後半、愛知県幡豆郡出身、愛知県幡豆郡在住
@参加者F023:女性40代後半、岐阜県出身、愛知県幡豆郡在住
@参加者M023:男性20代前半、愛知県西尾市出身、西尾市在住
@参加者F128:女性20代前半、愛知県西尾市出身、西尾市在住
@参加者の関係:英会話教室の友人
F107:***の町というのはちいちゃくって、城壁がこう町全体をぐるっと回ってて、それが城壁の上を歩いても1時間ぐらいですよね。
F023:1時間かからないぐらいだね。
4、50分で。
F107:そうそう。
ほいでさあ、ずっと歩いていたんだけど、そうすと上から、なんか町の中が見れるじゃん。
あるよね。
ほいでさあ、なんか途中でワンちゃんに会ったんだね。
(ふーん)散歩をしてるワンちゃんに会ったんだ。

これらの文章中に、Translated MRCDBに含まれる単語から、文章ごとの具象性スコア、心像性スコアを計算します。計算方法は下記です。

  1. 文章中に含まれる単語のうち、Translated MRCDBに含まれる単語を抽出する。単語が複数存在する場合は全て抽出する。
  2. Translated MRCDBのスコアリングを、文章のスコアとして用いる。単語が複数ある場合はその平均をスコアとする。

例えば、「ミルクを飲み、ステーキを食べた」と言う文章があった場合、ミルクとステーキの具体度はそれぞれ654.0, 646.5のため、文章の具象性スコアは(654.0 + 646.5) / 2 = 650.25とします。

また、MRCDBにはasのような接続詞も含みますが、今回は単語のみを考慮に入れ、文脈などは考慮に入れないため、利用する品詞も名詞に限定します。 その際分かち書きが必要になるため、今回はvibratoを利用しました。

tech.legalforce.co.jp

単語ベースでのスコアリングを行う

スコアリングを行った後の文章は下記のようになります。

スコアリング後の文章

columnの意味はそれぞれ下記です。

  • org_text: 元々の文章
  • use_word:org_textのうち、Translated MRCDBに含まれていたword
  • CNC: use_wordの具体度を平均したもの

まずは具体度が高い文章5件を見てみましょう。

具体度が高い文章5件

比較のため、具体度が低い文章5件も確認します。

具体度が低い文章5件

use_wordが少ないため、高い文章と低い文章であまり差が出ていないように見えます。

そのため、具体度が付与されている単語を増やす方針を取りたいと思います。

スコアリングされた単語を増やす

スコアリングされた単語を増やすために、簡単に推論を行います。

方法として、単語ごとのベクトルを特徴量として用い、Translated MRCDBを正解データとして学習したモデルを用いて推論します。

スコアリングを行う文章の名詞を抽出する

今回の推論対象のデータに含まれる名詞を抽出します。 個数としては481個になりました。先頭10個を抜き出すと下記のようになります。

推論対象のデータに含まれる名詞10個

単語ごとのベクトルを、日本語 Wikipedia エンティティベクトルから取得する

次に単語ごとのベクトルを日本語 Wikipedia エンティティベクトルから取得します。この際、ベクトルが付与されない単語については除外しました。

日本語 Wikipedia エンティティベクトル

スコアリングを行う文章の名詞に対し、SVRを用いて具体度を推定

SVRはscikit-learnのライブラリを利用します。

scikit-learn.org

パラメータは特にいじらず初期値です。また、日本語 Wikipedia エンティティベクトルに対し標準化を行っています。

推論結果

具体度が高いと推論された単語5件は下記のようになりました。

具体度が高いと推論された単語5件

比較のため、具体度が低いと推論された単語5件も確認します。

具体度が低いと推論された単語5件

サンドブリキ行動十分を比較すると、確かに具体的な単語がスコア高く推論されていそうです。意外とできるものですね。

再度、文章ごとのスコアリングを単語ベースで実施

「単語ベースでのスコアリングを行う」と同様の方法でスコアリングを行いました。

まず、スコアリングが行われた文章が増えたことを確認します。

推論前は269 / 827 = 33%、推論後は612 / 827 = 74%の文章がスコアリングされており、推論可能な文章が増えたことが分かります。

次に、スコアリングに使う単語の数の平均が増えていることを確認します。 推論を行う前は平均1.40単語使われていました。推論を含めた場合は平均2.91単語が含まれており、一定単語数は増えていそうです。

具体度が高い文章10件を見てみましょう。

具体度が高い文章10件

具体度が低い文章10件も確認します。

具体度が低い文章10件

・・・推論なしの場合とあまり違いを感じませんね🤔

もうちょっと比較するために、出力結果を一覧にまとめました。 なんとなくですが、推論後の方が、具体度が低い文章に対する納得感が増すと思います。

出力結果一覧

改善するなら

まず、文章が具体的とはどういうことかを明確にする必要があるなと思いました。

次に、想定しているユースケースを具体的にし、より適切なコーパスが必要だと感じました。

また、文章に含まれる単語の平均をとる方法の改善も必要だと考えます。含まれる単語が多ければ多いほどスコアリングも平均に向かっていくためです。

終わりに

以上です。明日はAmane KamiyaさんによるBrand Strategyグループについてです。どんなグループなのでしょうか。わくわくですね。