genzai0の日記

にっき

ワードサラダの簡易分析

f:id:genzai0:20191209000127p:plain
サラダ

むかつくほどおいしそうなサラダですね。僕が知りたいのはそれじゃないんですよ。

概要

ワードサラダ形態素解析して分析しました。ワードサラダとは「構造として正しい文であり、文章としては正しくない」文のことです。意味がわからないけど、日本語としては正しい、みたいな。

2006年、今敏監督のパプリカから引用した文章を用いて単語の特徴を掴みます。

この記事を書くのは二回目です。なぜなら、本物は下書きのままインターネットの狭間で旅をしているからです。

見つけてきた。古の時代に作ってもう使ってないアカウントの方で記事を書いていて、そっちにあった。

本文のぉーはじまりはじまり


f:id:genzai0:20191209000127p:plain
サラダ

おいしそうでとってもむかつきますね。僕は別にサラダが食べたいわけじゃないんですよ。

概要

ワードサラダを簡易的に解析します。ワードサラダとは、「文法が正しく、文章が破綻している」文です。

2006年公開の今敏監督の映画、パプリカでのセリフを用いました。

引用と分析

使用した文を紹介し、その後に句点ごとに区切りつつ、分析をします。

パプリカ一節より

<引用はじめ>

  1. うん。必ずしも泥棒が悪いとはお地蔵様も言わなかった。
  2. パプリカのビキニより、DCミニの回収に漕ぎ出すことが幸せの秩序です。五人官女だってです!
  3. カエルたちの笛や太鼓に合わせて回収中の不燃ゴミ吹き出してくる様は圧巻で、まるでコンピューター・グラフィックスなんだ、それが!
  4. 総天然色の青春グラフィティや一億総プチブルを私が許さないことくらいオセアニアじゃあ常識なんだよ!
  5. 今こそ、青空に向かって凱旋だ!
  6. 絢爛たる紙吹雪は鳥居をくぐり、周波数を同じくするポストと冷蔵庫は先鋒をつかさどれ!
  7. 賞味期限を気にする無頼の輩は花電車の進む道にさながらシミとなってはばかることはない!
  8. 思い知るがいい!三角定規たちの肝臓を!
  9. さぁ!この祭典こそ内なる小学3年生が決めた遙かなる望遠カメラ!
  10. 進め!集まれ!
  11. 私こそが!お代官様!
  12. すぐだ!すぐにもだ!わたしを迎えいれるのだ!!

<引用終わり>

オセアニアじゃあ常識なんだよとは (オセアニアジャアジョウシキナンダヨとは) [単語記事] - ニコニコ大百科

行ごとの分析

以下、私見による分析であり根拠がありません。推測で正しいと思われるものを述べています。

1

「泥棒」という単語から、「お地蔵様」という道徳的観念の結びつきが考えられます。文意が取れるので分解をしません。

2

単語の説明をします。

2-1. 「パプリカのビキニより」

・登場人物の一人。パプリカという名の美しい女性。

2-2. DCミニ

・作中に登場する夢を共有する機械の名称。

2-3. 五人官女

・推測であるが雛人形についての言及。五人囃子と三人官女が混濁している。

まず、単語に意識が引っ張られて分かりづらいので文の構造を理解するために、分解して説明します。


2の全文です。

「パプリカのビキニより、DCミニの回収に漕ぎ出すことが幸せの秩序です。五人官女だってです!」


2の単語をアルファベットに置換しました。

「AのBより、CのDがEのFです。Gだってです」


これでわかるとおり、文の構造としてはBとDの単純比較を行っていることになります。

しかし、文の構造から考えると単語の意味が連ならないので、正しい文ではありません。すなわち正しいワードサラダですね。

そろそろ面倒臭いのでツールを使って解析をします。今回はjanomeという日本語形態解析エンジンを使用しました。

janomeによる形態素解析

GitHub - mocobeta/janome: Japanese morphological analysis engine written in pure Python

/data/test.txt

/test.py

/user.csv

のファイル構成です。

まずはとりあえず解析。すると、空白文字が記号として大量に抽出されるので除去。(他にもRegexReplaceCharFilterによる細かい指定もできます) そこまでのソースコード

from janome.tokenizer import Tokenizer
from janome.analyzer import Analyzer
from janome.charfilter import *
from janome.tokenfilter import *

def set_analyzer():
    char_filters = [UnicodeNormalizeCharFilter()]
    tokenizer = Tokenizer()
    token_filters = [CompoundNounFilter(), POSStopFilter(['記号']), LowerCaseFilter()]
    a = Analyzer(char_filters, tokenizer, token_filters)
    return a

if __name__=="__main__":
    path = "data/sample.txt"
    f = open(path, mode="r", encoding="utf-8")
    s = f.read()
    
    a = set_analyzer()

    for token in a.analyze(s):
        print(token)

    f.close()

token_filtersでのPOSStopFilterで指定した要素を除去しています。

結果(一部)が以下のようになります。

f:id:genzai0:20191208235818p:plain
結果1

いい感じですね。最低限の区切った文字列がほしいときは用意されているtokenizer飲みを使用します。janomeは分かちモードって言うらしいですね。

f:id:genzai0:20191209003019p:plain
結果2

これはAnalyzerとは別メソッドなのでゴミを取り除くには前処理済みのテキストか、他の方法か自前で実装するしかなさそうです。

名詞の抽出

RegexFileterで!と空白文字の除去のみ指定し、POSKeepFilterで名詞を指定しました。ほかは同様です。

f:id:genzai0:20191209003754p:plain
名詞の抽出

いい感じですね。タブ区切りなのでsplitして、strにオブジェクト変換してindex0のみをとってリスト化しましょう。見事な"見える化"ですね。

f:id:genzai0:20191209005043p:plain
名詞のリスト化

さて、ここで一覧が見やすくなったのでぼんやり全体を見てみると気になる文字が有ります。「気」…とかのあと気になりますね。

抽出が細かすぎて一つの複合語として出したいところも、出ちゃってます。結合したいので、ユーザー辞書を同列に配置します。

無頼の輩、コンピューターグラフィックス、一億総プチプル、内なるなど気になったものを登録します。

僕含め日本語を得意としない人類のために参考としてYahoo製の簡単品詞分類器があるので、それを利用しました。

日本語自動品詞分解ツール - konisimple tools

Mecab様式でも良かったのですが、面倒だったので簡略版の表記でcsvを作成しました。

f:id:genzai0:20191209021245p:plain
複合語の登録

登録は名詞にしないと今回の設定では出力されませんが、POSKeepFilterの値を変更すればいいだけなので分けたい人は「カスタム名詞」とかつけてもいいですね。

f:id:genzai0:20191209022427p:plain
user.csv

というわけで、具体的な値はわからないけど一見すると使用されている名詞に一貫性がないことが可視化されましたとさ。

感想

本当はこの後クラス分類とかして、イケイケ†DataScientist†を気取るか、ワードサラダを自動生成するとかなんとかしたかったのですが、そもそも方法とアイデアと実装力がないので、このへんで終了です。

クラス分類とかまずもって、これをどう処理するかの検討がつかないのですけれど、どういう方法がとれるんですかね。共起を調べてもそりゃあ意図されて単語の結びつきが存在しないので共起度やネットワーク見ても「ホンマか?」ってなるでしょうし…

意味を汲み取るのも苦手らしいですしね。ぺーぺーが臨むことじゃなさそうです。

ワードサラダの自動生成はなんとなく実現できそうですね。一つの名詞に対してのクローリングを行って共起度が高めのものを交換する、などしたら面白そうです。

ただし、美しいワードサラダができるかどうかは別なので、それも難しそうですね。(今回で言う五人官女からの笛や太鼓、回収中の不燃ごみと冷蔵庫、三角定規と小学生などの関連を想起させる単語をどう散りばめていくか)

楽しかったです。ご覧いただきありがとうございました。