Pythonで文体分析

土曜日, 8月 28, 2021

Python 自然言語処理

t f B! P L

村上征勝著の「この本を書いたのは誰だ? 統計で探る“文章の指紋”」を読んで非常に面白かったので実験。

本の概要

文章に無意識のうちに現れる「クセ」を分析して、著者を特定するノウハウについて解説している本。
著者はこのクセを「文章の指紋」と呼んでいる。

この技術を使うと、真犯人の犯行声明文と模倣犯の犯行声明文の区別ができたり、古い文献・文学作品の著者が誰であるか(贋作の判定)ということを推測したりできる。

ざっくりいうと、自然言語処理における機械学習の特徴量エンジニアリングに相当する操作を行い、文章を何らかの特徴量に変換する。
そして、問題となる文章同士の特徴量を比較することで、その文章同士が似ているか(同じ人物によって書かれたか)、そうでないかを判定する、という仕組み。

基本的に出来ることは、2つの文章が同じ人物によって書かれたか?の判定であり、当然ながら何も無いところから著者名をひねり出すことはできない。

古い文学作品でいうと、例えば紫式部の源氏物語の一部が、娘の大弐三位によって書かれているという説があるが、この場合、源氏物語の一部と大弐三位の文章を比較することで、類似性の判定を行う、といった感じになる。

この本では、上記のような事例が多数取り上げられており、NLPerなら非常に興味深く読めると思うのでめっちゃおすすめ。

特徴量エンジニアリング

単語には内容語(意味を表す名詞、動詞など)と機能語(読解を補助する機能をもつ助詞など)がある。内容語は当然、文章内容の影響を受けるので、機能語に着目するのが良いとされる。

例えば、日本語だと助詞の出現頻度などが利用できる。

実験

ということで

夏目漱石の文章

  • 坊っちゃん
  • 三四郎
  • こころ
  • 彼岸過迄
  • 吾輩は猫である

芥川竜之介の文章

  • 蜘蛛の糸
  • トロッコ
  • 河童
  • 羅生門

を区別する実験をやってみる。

特徴量にした後どうするのかというと、特徴量同士の差異を統計的仮説検定で証明したり、クラスター分析系の手法で似た文章をまとめるという作業をする。

今回は、助詞のbigramを特徴量として、階層型クラスタリングで上記10作品がどのようなクラスタを形成するかを確かめる。

https://gitlab.com/youmounlp/nlp-notebooks-misc/-/blob/master/aozora_clustering.ipynb

階層型クラスタリングでは、距離関数はコサイン距離、クラスタリングはウォード法を用いた。



最後の図を見ればわかるように、いい感じに夏目漱石の作品と芥川竜之介の作品が分離されている。

と、まぁいい感じには分離できている風に見えるのだが、樹形図のどこの高さで分離するかや、距離関数やクラスタリングの際のアルゴリズムは、悪く言えば恣意的に決定する必要があり、今回の例でも距離やアルゴリズムを変えると、樹形図はこれほど綺麗には分かれない。

とはいえ、いくつか試した感じでは、芥川竜之介の作品は綺麗にひとまとまりになっていたので、助詞bigramでもこのような区別ができることに結構感動した。

難しさ

統計的仮説検定はともかく、クラスタリングは特徴量の選定やハイパーパラメータの調整によって恣意的な結果を生みやすい。

こういうケースでは条件を変えながら実験を行い、

  • 複数の特徴量で試しても同じ結論になる
  • 複数のモデル、ハイパーパラメータで試しても同じ結論になる

という確信を積み重ねていくのが正攻法のように思える。

偽の犯行声明文や贋作などの「似せて書いた文章」であっても、無意識のうちに細かい言語情報に差が出るという話はとても面白いですね。

QooQ