議事録アナロジー3
忙しくて更新をすすめられないうちに、もうそろそろ4月7日に千葉県議会議員の選挙日がちかづいてきてしまいした。やばい なにか間に合わせて実験したいですけど時間的に厳しい。。
とりあえず、今までのところ議事録ベースのWordEmbeddingでできることと課題をまとめてみます。
できること:特徴の似ている単語抜き出し
前回もだしましたが、以下のプログラムで見ることで理解ができました。単語の前後関係で特徴量を学習させたあと、norm_vecs_by_rowで特徴量を距離でわることで長さが1のベクトルをつくり、それをmx.nd.dot で内積をとることで向きが同じベクトルほど高い値がでるということで類似の特徴をもっている単語を浮かび上がらせます。すごいですね。
def norm_vecs_by_row(x):
return x / (mx.nd.sum(x * x, axis=1) + 1e-10).sqrt().reshape((-1, 1))
def get_k_closest_tokensEmb(vocab, embedding, k, word):
word_vec = embedding[[word]]
vocab_vecs = norm_vecs_by_row(embedding[vocab.idx_to_token])
dot_prod = mx.nd.dot(vocab_vecs, word_vec.T)
indices = mx.nd.topk(
dot_prod.reshape((len(vocab.idx_to_token), )),
k=k + 1,
ret_typ='indices')
indices = [int(i.asscalar()) for i in indices]
result = [vocab.idx_to_token[i] for i in indices[1:]]
print('closest tokens to "%s": %s' % (word, ", ".join(result)))
平成30年第3回四街道市議会の議事録で学習させたモデルにたいして、
四街道市の市長、副市長、市議会議員一覧の名前で関連深い単語をだしてみます。
get_k_closest_tokensEmb(vocab,embedding,10, "佐渡斉")
get_k_closest_tokensEmb(vocab,embedding,10, "武富裕次")
get_`k_closest_tokensEmb(vocab,embedding,10, "阿部百合子")
get_k_closest_tokensEmb(vocab,embedding,10, "津島秀樹")
get_k_closest_tokensEmb(vocab,embedding,10, "大越登美子")
get_k_closest_tokensEmb(vocab,embedding,10, "西塚義尊")
get_k_closest_tokensEmb(vocab,embedding,10, "成田芳律")
get_k_closest_tokensEmb(vocab,embedding,10, "栗原愛子")
get_k_closest_tokensEmb(vocab,embedding,10, "関根登志夫")
get_k_closest_tokensEmb(vocab,embedding,10, "中島康一")
get_k_closest_tokensEmb(vocab,embedding,10, "栗原直也")
get_k_closest_tokensEmb(vocab,embedding,10, "坂本弘毅")
get_k_closest_tokensEmb(vocab,embedding,10, "大谷順子")
get_k_closest_tokensEmb(vocab,embedding,10, "清水清子")
get_k_closest_tokensEmb(vocab,embedding,10, "岡田哲明")
get_k_closest_tokensEmb(vocab,embedding,10, "戸田由紀子")
get_k_closest_tokensEmb(vocab,embedding,10, "石山健作")
get_k_closest_tokensEmb(vocab,embedding,10, "山本裕嗣")
get_k_closest_tokensEmb(vocab,embedding,10, "森本次郎")
get_k_closest_tokensEmb(vocab,embedding,10, "高橋絹子")
get_k_closest_tokensEmb(vocab,embedding,10, "長谷川清和")
get_k_closest_tokensEmb(vocab,embedding,10, "阿部治夫")
get_k_closest_tokensEmb(vocab,embedding,10, "清宮一義")
'''
closest tokens to "佐渡斉": 修正, 斉, 市長, 山本, 賛成, 原案, ~, 動議, 別紙, 案
[[0.7324842]]
closest tokens to "武富裕次": 裕次, 市長, 佐渡, 一括, 納税, 斉, ふるさと, 博, 畠, 澤
[[0.8677565]]
closest tokens to "阿部百合子": 阿部, 治夫, 津, ふさわしい, 郎, 教師, 秀, 文部, 教科書, 樹
[[0.8449057]]
closest tokens to "津島秀樹": 津島, 共産党, 賛成, 討論, 山本, 一言, 削る, 番号, 表面, それでは
[[0.994328]]
closest tokens to "大越登美子": 大越, 越, 一言, 清水, 傍聴, コンビニ, この間, ありがとう, 谷, ネットワーク
[[0.95800936]]
closest tokens to "西塚義尊": 000, 尊, 義, ,, 万, ちなみに, 円, 宅地, 3, 平方メートル
[[0.7319887]]
closest tokens to "成田芳律": 成田, 水田, 律さ, 芳, 律, 借り手, 貸し手, 買い取り, 貸し付け, 登録
[[0.627289]]
closest tokens to "栗原愛子": 栗原, 冊数, 直也, 利, 貸し出し, 冊, 空家, どちら, オレンジ, 若年
[[0.8071137]]
closest tokens to "関根登志夫": 関根, 気化, 根, クーラー, 動議, 関, 哲, 排, 明, スポット
[[0.9341278]]
closest tokens to "中島康一": 康一, 高学年, 副, サポート, シート, 分かれ, 担任, 教科, 進学, ○
[[0.64200366]]
closest tokens to "栗原直也": 栗原, 愛子, 開示, どちら, 移転, 登記, ◆, 分筆, 律さ, 残高
[[0.9524354]]
closest tokens to "坂本弘毅": 弘毅, なんか, 44, チーム, ◆, 学年, 76, 違っ, 違う, 粘り強く
[[0.83597]]
closest tokens to "大谷順子": 順子, 排出, 可燃, 生まれ, 頂戴, 紙, 雑, 類, ◆, ネットワーク
[[0.81720513]]
closest tokens to "清水清子": 清水, シート, ギャラリー, 後ほど, 律さ, 通っ, 愛子, 大越, 弘毅, 板
[[0.9923124]]
closest tokens to "岡田哲明": 哲明, 造成, 康一, 中島, 副, 勤続, 月給, 会派, 実は, 治夫
[[0.88457227]]
closest tokens to "戸田由紀子": 戸田, 議長, ○, さん, 。, 以上, 〔, ◆, 週間, 絹子
[[0.9009727]]
closest tokens to "石山健作": 空き地, 空き, 空き家, たち, 出店, 不十分, 雑草, 店舗, 繁茂, 平方メートル
[[0.5715365]]
closest tokens to "山本裕嗣": 山本, 裕, 嗣, 発議, 署名, 菅, 作, 信, 査, 起立
[[0.7059712]]
closest tokens to "森本次郎": 森本, 残っ, メニュー, 変え, 返礼, いきなり, 去年, くず, 鉄, よかっ
[[0.9812455]]
closest tokens to "高橋絹子": 高橋, 公明党, IC, 黒板, T, 週間, 孤独, 入所, 宅, 山本
[[0.97837806]]
closest tokens to "長谷川清和": 子育て, 掲げ, 佐渡, 頑張っ, 納税, 下げる, 実感, 政策, 講じ, 経常
[[0.560797]]
closest tokens to "阿部治夫": 阿部, 百合子, 補佐, 康一, 岡田, 会派, 中島, 見込ん, 副, 哲明
[[0.9132391]]
closest tokens to "清宮一義": 方法, 〕, いきなり, 規制, 案, 無理, 費用, 品目, ましょ, 上下水道
[[0.17982343]]
'''
できること:概念の足し算、引き算
よくある例では 王様-男+女 = 女王様 みたいな感じですね。これこそがアナロジー(類推)しているところです。
参考にこのAnalogyのプログラムですが以下のword_vecsの部分で本当に足し算引き算をしているんです。面白いですね。
def get_top_k_by_analogy(vocab, embedding, k, word1, word2, word3):
word_vecs = norm_vecs_by_row(embedding[[word1,word2,word3]])
word_diff = (word_vecs[1] - word_vecs[0] + word_vecs[2]).reshape((-1, 1))
vocab_vecs = norm_vecs_by_row(embedding[vocab.idx_to_token])
dot_prod = mx.nd.dot(vocab_vecs, word_diff)
Wikipediaなどで網羅的に文章を学習させるとそれなりに納得できる答えがでてくるのですが、今回は議事録の文章からしか学習させていないのでそのなかでよく使われている言葉にしないと意味をなさないので入力する言葉を選ぶのに頭を捻る必要がありました。
例1.赤字-予算+学校 , いじめ-学校+四街道
get_top_k_by_analogy(vocab,embedding,10,"予算","赤字","学校")
=> closest tokens to "。": 赤字, 単, 連続, 特徴, 長期, 勤続, 先生, 年数, 深刻
get_top_k_by_analogy(vocab,embedding,10,"学校","いじめ","四街道")
=> closest tokens to "。": いじめ, 改定, 防止, 市, 市議会, 条例, 制定, 平成, 埋立
市議会って四街道にとって、、、とか 色々ドキッとさせられる結果ではありますが、先頭の言葉がそのまんまなのであまりうまくいってないように思います。
例2 嘘-人+四街道, 嘘-人+議会
get_top_k_by_analogy(vocab,embedding,10,"人","嘘","四街道")
=>closest tokens to "。": 条例, 市, ホームページ, 市議会, 年生, 取り上げ, 最後, 整備, データ
get_top_k_by_analogy(vocab,embedding,10,"人","嘘","議会")
=>closest tokens to "。": べく, く, パブ, コメ, 6月, ハト, 審査, 禁止, 市議会
こちらは、条例、ホームページ、パブコメ、、まさに呼吸をするかのごとく嘘をつくということでしょうか。現実を即しているかはともかく、議会の議事録の特徴から計算するとこういう結果になるのかと考えさせられますね。
例3 賛成+議員名, 反対+議員名, 質問+議員名
get_top_k_by_analogy(vocab,embedding,10,",","反対","大谷順子")
=> closest tokens to "。": 順子, 大谷, 頂戴, 二重取り, 可燃, 命ずる, 承諾, 減量, 手数料
get_top_k_by_analogy(vocab,embedding,10,",","賛成","大谷順子")
=> closest tokens to "。": 大谷, 順子, 決する, 起立, 願い, 動議, 津島, 頂戴, 秀樹
get_top_k_by_analogy(vocab,embedding,10,",","質問","大谷順子")
=> closest tokens to "。": 大谷, 順子, 頂戴, 暫時, 終わら, 休憩, 津島, 排出, 秀樹
この議員のかたは例えば以下のような議事録がのこっていて、ゴミ袋有料化についての質疑、反対表明をおこなっていますので反対で抽出されたものは誤りではないですが、賛成、質問で抽出されたものはイマイチです。
◆大谷順子議員 市民ネットのアンケートで、市がもっとごみの減量化に努力すべき、あるいはこれ税金の二重取りだ、それから負担をもっと少なくしてほしいという意見も多かったのです。
それで、指定袋の価格なのですけれども、6月もお聞きしましたけれども、そのときの説明では1リットル当たり1.2円の価格ということで、その説明は10リットル当たりの処理経費が76円、それで家庭の負担が12円で負担率は16%という説明だったのです。これなぜ1.2円にしたかという根拠は示されていないわけなのです。このごみ減量化10%という目標を立てているわけですけれども、これ1.2円にしなければ10%達成できないのですか。
みえてきた課題
不要な空白で分けられてしまった単語(名前など)を一つにしたい。学習から助詞や、句読点を抜きたい。議事録をもっと複数年分を大量に入力したい。一般的な単語の特徴量(賛成、反対、税金など)はほかのところから文章をまぜて調整したほうがよさそう。検出結果から自分の部分一致は削除する。関連度が低いものは結果から削除する。単純に各議員が賛成、反対した議案を一覧でだしたいなら別のルールベースの手法が必要そうだ。
この次のすすめかた
ひととおりWordEmbeddingの動きは理解できたので、もともとやりたかった議員名をいれるとその人の実績に応じたなにか参考情報を提示するという、基本最低機能をこんどの選挙までに県議会の議事録をみつけて出せるようにしてみたいと思います。
この記事が気に入ったらサポートをしてみませんか?