スリスリくん(@suzurijp)の自動翻訳ツールを作る
ゴールイメージ
https://gyazo.com/e8ace587b11259b6656fdd4682a9b28c
なんとなく自動翻訳で彼の発言を作り上げたくなった
スリスリくんの発言(text)には独特な表記の規則性がある
自然言語処理の技術を活用して任意の文章を彼の発言のような表記に翻訳するツールを作成してみる
アプローチ
まずはスリスリくんの発言サンプルをみてみる
code:sample1
そうめんツルツル!忍者スリスリくんデス。
この雨が終わったら、いよいよ最高の夏はじまるけど、みんな準備できてマスか?
夏に向けて、新作Tシャツ追加するか〜〜!という気持ち高まってるみんなのために、
スリスリ、人気のTシャツを研究して、あの子が思わず着たくなっちゃうようなデザインのヒントをまとめてみマシた。
これからはじめてデザインを作るキミにも、
いつもイカしたデザインを作ってくれるキミにも、
ちょっとでもお役に立てるとうれしいデス!
そうめんツルツル! はよく分からない。夏の記事なので季語なのだと思う。
カタカナ変換が見られる
〜〜です -> 〜〜デス
できてますか? -> できてマスか?
みました。 -> みマシた。
単語選びに特徴があるかも
「格好いい、素敵な」ではなくイカした
「君、きみ」ではなく キミ
「ですます」のカタカナ変換
水分ホキュホキュ!忍者スリスリくんデス。 季語っぽい
同じく「ですます」のカタカナ変換
発言の特徴
「ですます」のカタカナ変換がある
アプローチ:形態素解析をして、該当の「ですます」をカタカナに変換する あいさつ的な役割で季語っぽい単語を発する場合がある
アプローチ:一般的な季語の辞書(ある?)を活用してスリスリくんが使いそうな"季語あいさつ"を自動生成する 単語選びに独特な何かがある(仮説)
アプローチ:実データをもとによく使われる単語を辞書化(あるいは機械学習)し、その単語の類義語が入力された場合によく使われる単語に置換する
/icons/hr.icon
実装ログ
2019-12-12
あいさつを雑に実装した
https://gyazo.com/957a85cf7326579501300c16dcc9e143
2019-12-09
リストアップしたら68個になった。季節感がないものが多くてどうしよう〜という感じだ。
ランダムピックアップでも良いかもなぁ。
とはいえ季節感が合わない挨拶が来ると嫌だから、やっぱり季節判定のロジック入れたほうがいいか。
2019-12-07
「漢字の開き」を実装して行くぞ〜。gem 側の修正。実装完了〜
次は「季語あいさつ」だ。手を動かさないとなぁ〜
季語あいさつを洗い出すところからだな
2019-12-06
https://gyazo.com/075735b3c3c04d303c1f33e00dfafa4c
2019-12-05
2019-12-04
約2ヶ月ぶり
社のアドベントカレンダーでこれについて書こうと思うのでもう少し追加実装する
やりたいこと
/icons/pass.icon サービスのストーリーを考える
「翻訳機」や「Bot」と表現してしまうと詰まらない
中身はただの翻訳機であってもそういう表現はしない方が面白い
思いつきメモ
スリスリくんは忍者。忍びの者。その割には露出が多い。
忙しそう。本当の姿はなんなのか。
SNS疲れしているかもしれない。
そろそろ影武者が欲しいと思っているのでは?そうに違いない。
忍者という文脈では「分身の術」の方がフィットするかな?
「分身」はナルトの影響で数が増える印象もついてきてしまう
「身代わりの術」はなんか身代わり人形(= 攻撃してみたら本体じゃなくて丸太だった、みたいな)の印象
CSSフレームワークを入れてデザインを当てる
モバイルでの利用にも耐えうる感じにする
/icons/pass.icon suri_lang gem のリファクタリング
テストの共通化
inputとexpectedをyamlで管理するような感じにする、など
/icons/pass.icon suri_lang gem に「漢字の開き」を実装
予め -> あらかじめ みたいな。
一部の漢字については、漢字を使わずにひらがな表記にする機能
suri_lang gem に「季語あいさつ」を実装
過去のジャーナルとnoteから「季語あいさつ」っぽいものをリストアップ
最悪これをランダムに表示しても良い
入力文章を春夏秋冬のどれに近いか分析し、一番近い季節の「季語あいさつ」をつける
単語の分散表現を用意する
どのコーパスを使って分散表現を用意する?
入力文章の各単語について、春・夏・秋・冬それぞれとのコサイン類似度を出す
コサイン類似度の合計値が一番高い季節をその文章の季節である、とする
その文章の季節と同じ季節の「季語あいさつ」の中からランダムに選ぶ。
2019/09/29
昨日作ったやつをHerokuにdeployして外から触れるようにするぞ
Dockerfile の修正、heroku.yml の追加
heroku create , heroku container:push web などをしてみる
heroku gui のdeploy設定で、GitHubリポジトリと接続。masterマージでauto deployされるようにした
いけそう〜と思ったけど Errno::ENOENT: No such file or directory @ rb_sysopen - tmp/pids/server.pid なるエラーが出た。
config/puma.rb で発生するエラーっぽい。
よくみると pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" } という記載が。これRails6から追加されてるのかな?
この記事の トラブル1:サーバーが起動しない にも同じことが書かれてた
run phase で mkdir -p tmp/pids するようにしたら解消した
https://gyazo.com/8ab28216215ac6c6d02afab39ba496fc
2019/09/28
この前newしたrailsアプリケーションに入力フォームを実装していくぞ〜
テキスト入力フォームと変換後のテキストの表示エリアがあればいいな
TopControllerとVeiwだけでよさそう
actionはshowとtranslateだけかな
様子(雑)
https://gyazo.com/c9df7a3c24cfb76a38ea5bba142e6f70
とりあえずupper caseに変換するようにしてみた。
suri_lang gemを入れて変換処理をかますようにすればできあがり(雑)
外食して酒飲んで帰宅後、ちょいやった。できた。
https://gyazo.com/9a00701789c30b8303b2ce0fbc3dbc38
結構いいなw
https://gyazo.com/91689836183f531d4bead5bd49292056
2019/09/25
実に2週間ぶりである
雑だけどまあ動くからリリースしてみよう
rake build だ〜
code:sh
$ rake build
suri_lang 0.1.0 built to pkg/suri_lang-0.1.0.gem.
わーい
irbで動作確認するぞ
code:sh
$ gem install pkg/suri_lang-0.1.0.gem
...(略)...
Done installing documentation for ffi, natto, suri_lang after 25 seconds
3 gems installed
$ irb
irb(main):001:0> require 'suri_lang'
=> true
irb(main):002:0> SuriLang
=> SuriLang
irb(main):003:0> text = '私の名前は田中です'
=> "私の名前は田中です"
irb(main):004:0> SuriLang::Translator.translate(text)
=> "私の名前は田中デス"
irb(main):005:0> text = 'この雨が終わったら、いよいよ最高の夏はじまるけど、みんな準備できてますか?'
=> "この雨が終わったら、いよいよ最高の夏はじまるけど、みんな準備できてますか?"
irb(main):006:0> SuriLang::Translator.translate(text)
=> "この雨が終わったら、いよいよ最高の夏はじまるけど、みんな準備できてマスか?"
良さそう
リリースだ〜
code:sh
$ rake release
suri_lang 0.1.0 built to pkg/suri_lang-0.1.0.gem.
Tagged v0.1.0.
Pushed git commits and tags.
You have enabled multi-factor authentication. Please enter OTP code.
Code: ******
Successfully registered gem: suri_lang (0.1.0)
Pushed suri_lang 0.1.0 to rubygems.org
なんて簡単なんだ、bundlerすごい。便便便利。
このgemを使った雑なアプリケーション作るか
DB使わないから -O オプションつけるのもありかな?
Rails6でいくぞ〜最新が最高〜
と思ったらwebpackerがデフォルトなんだよなぁ、skipする方法あるかな?
--skip-javascript オプションでいけた
いつもの Yay! You’re on Rails! が出た。いったんOK〜。
2019/09/11
品詞扱いを考慮してほしいテストケースを書いてそのテストケースが通るように修正していくぞ~ TDD!
ただの分かち書きじゃなくて、品詞付きで分かち書きする
品詞に応じてカタカナ変換をするかしないか判断する
"単語,品詞" をkeyにしたHashを作って、これを辞書として該当するものがあったら変換する、という形にしてみた
code:rb
nm = Natto::MeCab.new('-F%m,\s%f0,\s%s') text = '心の中で3回唱え、 ヒーロー見参!ヒーロー見参!ヒーロー見参!'
pattern = /ヒーロー見参/
nm.enum_parse(text, boundary_constraints: pattern).each do |n|
puts n.feature if !(n.is_bos? || n.is_eos?)
end
2019/09/10
久々に。
やろうとしていることは「標準語を方言に変換する」みたいなことに近い気がしている
方言に変換する方が100倍くらい難しいと思うけど
「自然言語処理 方言」で検索 -> 論文がいくつか出てきた
品詞の扱いも考慮しないとダメ に関して、
自然言語処理的なベストプラクティスなアプローチがあると思うんだよなぁ。できればそういうアプローチを取りたい。
ruby-jpのnlpチャンネルで聞いてみようかな?
スクラッチな感じでやるなら、例えば「助動詞の "まし" は "マシ" に変換する」みたいな感じになる。
2019/08/29
朝から昨日の続きをば。
いよいよ夏がやってきました -> いよいよ 夏 が やってき まし た -> いよいよ 夏 が やってき マシ た
雑なカタカナ変換までやった
品詞の扱いも考慮しないとダメ
この例↓だと問題ないけど、
code:日本からきました
日本 名詞,固有名詞,地域,国,*,*,日本,ニッポン,ニッポン
から 助詞,格助詞,一般,*,*,*,から,カラ,カラ
き 動詞,自立,*,*,カ変・クル,連用形,くる,キ,キ
まし 助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
この例↓だとダメ
code:もう少しましなものはないのか?
もう少し 副詞,助詞類接続,*,*,*,*,もう少し,モウスコシ,モースコシ
まし 名詞,形容動詞語幹,*,*,*,*,まし,マシ,マシ
な 助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
もの 名詞,非自立,一般,*,*,*,もの,モノ,モノ
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
ない 形容詞,自立,*,*,形容詞・アウオ段,基本形,ない,ナイ,ナイ
の 名詞,非自立,一般,*,*,*,の,ノ,ノ
か 助詞,副助詞/並立助詞/終助詞,*,*,*,*,か,カ,カ
? 記号,一般,*,*,*,*,?,?,?
2019/08/28
natto使って適当なテキストを形態素解析してみる
MeCab自体と辞書は別途ダウンロードしないとダメ
brew install mecab, brew install mecab-ipadic するだけ
とりあえずわかち書きするロジックはできた。
そうめんツルツル!忍者スリスリくんデス。 -> そう めん ツル ツル ! 忍者 スリ スリ くん デス 。
固有名詞として スリスリ スリスリくん あたりを覚えさせないと分解しちゃう
流れとしてはこういう感じ↓
忍者スリスリくんです--(分かち書き)--> 忍者 スリスリ くん です 。 --(カタカナ変換)--> 忍者 スリスリ くん デス 。
2019/08/25
まずは「ですます」のカタカナ変換をできるようにしよう
Pythonでやるのが定石だけどtanaken0515.iconはRubyistなのでRubyでやる スリスリくんの発言(= スリスリ語)に変換するRubyGemを実装する
形態素解析をするのでMeCabを使うと良さそう
rubygemsを "mecab" で検索すると納豆が出てくる
nattoは2019年もメンテされているしダウンロード数も25万あるのである程度安心できそう
What is natto?
A gem leveraging FFI (foreign function interface), natto combines the Ruby programming language with MeCab, the part-of-speech and morphological analyzer for the Japanese language.