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†を気取るか、ワードサラダを自動生成するとかなんとかしたかったのですが、そもそも方法とアイデアと実装力がないので、このへんで終了です。

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

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

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

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

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

日記

概要

日記です。ためになることは書いてありません

最近あったこと: 技術?周り

コンパイラのことが知りたくてうにゃうにゃしてるけど最近になって時間が取れなくなってきた。

gccに忖度されていた。具体的にいうとscanfで%sのフォーマットでとった文字列を&sとchar配列のポインタに謎指定していた。

ただ、-Wオプションで見るまで怒られなかったので少しなぁ…といった感じ。怒ってくれ。(多分何かしら理由があるか、ユーザーに操作をゆだねているからということであろうが)

C言語マスターしたい。何かを作るのにはまだまだ足りない。stdioのヘッダファイルもまだ追い切れていない。苦しい。

最近あったこと: 生活周り

コンビニ人間を久しぶりに読んだ。以降ネタバレをするので未読の人は読まないでほしい。

ヒト生活に対して無垢な人間といえばいいのか、正確ではないが一般的な言葉を用いるなら「サイコパス」というのがわかりやすいかもしれない。例を出すと、死んだ鳥を親に持ち寄り「晩御飯のからあげにしよう」といった風に、常識が外れているといった感じだ。

あらすじを紹介する。
彼女は自分がコンビニに適合していることを自覚している。しかし、"普通になる"ために周囲からコンビニのからの脱却を勧められ、それに向かうが、最後の最後で自分はコンビニを心から愛していることを再認識し「コンビニ人間」としての自覚を持つ。

なによりも彼女が正常でなく、終始他人に対して無関心であるのがとてもよかった。
他人に同調をしない作品は数多あるが、主人公の目線でそれに寄りそう形で語るのはとても面白かった。

第二の誕生というと語弊があるが、まさにその表現がぴったりくるほど「コンビニ人間」になる瞬間の祝福が鮮やかであった。

上からの目線になるが芥川賞受賞作品というのが十分に納得できる作品だった。

いろいろと違う人間二人に会った。

別のところで生きている人間といったところだ。自分と違い、様々に面白かった。特殊な関わり合い方をすると、その人に対しての全体的な印象が全く違うことが分かった。

たかが数年の違いでも、人としての重みやその重さの違いはきっと確かに存在する。ただ、そこには断絶された文化と事実だけが存在する。

みんな一緒じゃないんだなと当たり前だけど物悲しい気持ちになった。

日記

概要

日記です。ためになることは書いてありません。

最近の動向

dvorak配列は僕の脳に負担がかかるので一生使いません。多分。

今年のtwitterで割と盛り上がっているなと感じたのが新人研修の記事の無料公開です。

確かにものを知るといった点でとても良いのですが、弱小にとっては行間の小技や研修に際してあったであろう小さな改善や不具合への対処の情報が得られないわけで。

何が言いたいかというと、壁にぶち当たりまくって大変だぁといったところであります。

dockerのことを包括的に学ぼうとしているのですが、いかんせん記事が多いのと、dockerを軸としたさらなるアプリケーション(docker本体に付属しているswarmやcompose、laradock)など非常に厳しい。コツコツ頑張っているつもりではありますが、壁が多いことこの上ない…

https://team-lab.github.io/skillup/step2/02-environment.html

先輩にアドバイスをもらったとおり、フレームワーク内でいい感じにアプリケーションを作ってみたかったけれど、先がとても長いなといったところです。

localhostアクセスしてもdocker portで確認したとこ行ってもnginxがnot foundかましてくれるのでうーんといった感じ。

Fedora30でのkeymap周辺のメモ

概要

まだ全てが調べ終わらないうちに解決してしまったので、そこまでの調べ物の遷移になります。

CapsLockでのキー固定がいい加減うざったくなったのでそれを変更しようと思いました。

解決方法

私は入力に関してmozc環境を使用しているのでそちらから入力に対しての変更をしました。

[設定]から[地域と言語]で日本語(Mozc)から歯車マークでの設定で[一般]のタブからキー設定の選択の[編集]より変更をしました。

キーの割当としてはcapslockキーであるEisuをHankaku/Zenkakuと同様の挙動に設定しました。

人によってはCtrl、Escでも良さそうですね。

思い残したこと

概要の通りです。

入力のキーマップ自体の変更

キーマップの設定時に動作しないキーがある際にキーボード設定が間違えている可能性がある

windows: 101,104(us) 106,109(jis) mac: US/JIS smartphone: Android/iOS

http://qa.elecom.co.jp/faq_detail.html?id=5262#109

Xwindowsシステム

おそらくXwindowsシステムから設定をする方法。

/usr/share/X11からキーマップのなにかしらが見つかる。よくわからなかった。もうちょっと調べる。

https://lambdalisue.hatenablog.com/entry/2013/09/27/212118

Fedora30上でのdockerインストール

概要

本記事は「How To Install Docker on Fedora 30/29/28」https://tecadmin.net/install-docker-on-fedora/ の翻訳記事+αとなります。

自身の実践メモとして残しますが、記事内容に問題等ありましたらご連絡ください。

前書き

Dockerはコンテナを基としたアプリケーションフレームワークです。 これはコンテナ内での特殊なアプリケーションのすべての依存関係を包括しています。

Step1 前提として

標準的な環境としてDockerは64bitのOSを持つカーネル(kernelのバージョンが3.10以上)を必要とします。旧バージョンのカーネルではDockerの全機能を使用するための要件を満たしません。

$ uname -r

4.16.5-300.fc28.x86_64

Step2 DNFレポジトリの有効化

公式のDockerのyumレポジトリを追加しましょう。また、パッケージのメタデータのキャッシュをアップデートします。

$ sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo

$ sudo dnf makecache

Step3 FedoraでのDockerインストール

docker community editionのパッケージをインストールします。これは、Docker周辺の環境を整えるためのものです。(訳が怪しい)

$ sudo dnf install docker-ce

Dockerエンジンのインストールが成功したら、dockerサービスを有効化しましょう。

$ sudo systemctl enable docker.service

$ sudo systemctl start docker.service

また、Dockerサービスのstatusをチェックしましょう。

$ sudo systemctl status docker.service

チェックが終わったらqキーまたはCtrl+Cで確認を終了します。

f:id:genzai0:20190926102631p:plain

Dockerがインストールされ、動作しています。これでDockerコンテナとともに チュートリアルセクション に臨むことができるでしょう。

Dockerの使い方

Dockerグループへの追加(加筆)

権限についてはdocker公式サイトを参考にしています。

Dockerコマンドを使用するのにroot権限が必要になります。dockerを使用するたびに権限を認証する手間を省くためにdockerグループにユーザーを追加しておきます。

権限を確認すると、

$ grep -i docker /etc/group

docker:x:GROUP_ID:

dockerグループに属してないので、ユーザー自身に権限を付与します。

$ sudo usermod -aG docker USER_NAME

権限の付与に関してはgpasswdなど自身のやりやすい方法で行ってください。

Dockerイメージの探し方

最初にDockerのコンテナイメージをDocker hubから探しましょう。以下のように検索するとFedoraのイメージをリストとして出力します。

$ sudo docker search fedora
Dockerイメージのダウンロード

FedoraのDockerのコンテナイメージをローカルにダウンロードします。(注:元の記事ではUbuntuと記載されてありますが、下に示すコマンドは元記事と同様でFedoraで行っています。元記事の記載ミスと捉えました)

$ sudo docker pull fedora

Using default tag: latest
latest: Pulling from library/fedora
0be2a68855d7: Extracting [==============================>

イメージのダウンロードに成功したら以下のコマンドでダウンロード済みの全てのイメージを確認しましょう。

$ sudo docker images

REPOSITORY  TAG            IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu      latest         36248ae4a9ac        2 days ago          188 MB
fedora      latest         26ffec5b4a8a        2 weeks ago         275MB
コンテナイメージの起動

最後のステップとして、ダウンロードしたDockerのコンテナイメージを起動します。以下のコマンドでコンテナを新しく立ち上げましょう

$ sudo docker run -i -t -d fedora /bin/bash

起動中の全てのコンテナの確認の仕方は

$ sudo docker ps

CONTAINER ID     IMAGE     COMMAND        CREATED          STATUS         PORTS    NAMES
695efa2ace69     fedora    "/bin/bash"    58 seconds ago   Up 56 seconds           first_fedora

デフォルトのコマンドでは起動中のコンテナのみが表示されます。現在、停止させているコンテナも表示させるためにはオプションaを付加します。

$ sudo docker ps -a
コンテナの操作方法(start/stop/attach)

以下の操作でdockerのコンテナイメージを操作できます。CONTAINER_IDはdocker psで表示される(例では695efa2ace69と表示された)数字です。

コンテナの起動

$ docker start CONTAINER_ID

コンテナの停止

$ docker stop CONTAINER_ID

起動中のコンテナの使用

$ docker attach CONTAINER_ID

引用・参考

Docker公式ページ https://docs.docker.com/install/linux/docker-ce/centos/#install-using-the-convenience-script

How To Install Docker on Fedora 30/29/28 https://tecadmin.net/install-docker-on-fedora/

vape雑記

vapeやってます

先日(2019/05/01~)からvapeをやり始めて4ヶ月目の現在です。

知人から勧められてvape(電子タバコ)をしています。

vapeについてまとめておきたかったのでここに記します。

vape概要

組成に関してはネットで調べたものが大半で別に研究も検証もしていないので、専門性もありません。内容については保証できません。エビデンスとしてなるべく信用性の高いものを引っ張ってきました。

vapeについて簡単に説明すると「植物性グリセリン」と「プロピレングリコール」からなる液体に香料を混ぜ、蒸発させた水蒸気を吸うものです。

植物性グリセリン(vegetable glycerin)は要するに植物から採れた油です。

厳密には加水分解などを経て、それとなりますが詳しくはないのでわからないです。

www.sy-kogyo.co.jp

プロピレングリコール(propylene glycol)は要するに植物から採れた油or石油から作られたものです。

厳密には触媒を使うなどして、それとなりますが詳しくはわからないです。

www.mitsuichem.com

要は「吸うアロマ」です。

毒性について

結論から言うと「現状見込まれる毒性はない」です。FDA、WHOもそう言ってます。

化粧水を使う方ならわかると思いますが、植物性グリセリンはまさにそれです。「化粧水 自作」と検索すると一発で出てきます。毒性は皆無です。

プロピレングリコールですが、食品添加物として広く使用されています。

http://www.nihs.go.jp/hse/chem-info/ntp/ntpj/PG-j.pdf

一応計測では日に240g=2400mg接種しても大丈夫のようです。毒性は皆無ですがペット(猫)への影響及び乳幼児への影響が見込まれているため注意が必要らしいです。

よく不凍液に入っているから毒性だとか言われますが、プロピレングリコール→不凍液の一部、であって不凍液=プロピレングリコールではありません。LLC(クーラント・不凍液)ではエチレングリコールが95%を占めています。(Amazonで確認のためリンクを省略)

ニコチン・タールについて

ニコチン添加済みのもの、後入れのニコチンソルトもありますが少数と言われています。

タール添加は見たことありません。

タバコの種類について

混同しがちなのですが、電子タバコと加熱式タバコは違います。

アイコスなどの加熱式タバコは「たばこ葉」を用いて煙を出します。たばこの葉が含まれるのが特徴です。

対してeGo、iStickPico最近コンビニでよく見かけるmybluなどの電子タバコは「たばこ葉」を含みません。濡れたコットンに熱を加えているだけ、というのが特徴です。

https://www.jrs.or.jp/uploads/uploads/files/photos/hikanetsu_kenkai.pdf

vapeの危険性について

vapeは基本的に無害とされています。

www.sankei.com

www.afpbb.com

ja.wikipedia.org

中には危険と言われている実験もあります。しかしこれらは通常の運用では想定されていない方法での値を算出していると思われます。

One finding was that the first and last puffs produce widely varying emissions. Using a custom-built vaping apparatus emulating realistic vaping habits, researchers drew on the e-cigarette by taking puffs lasting 5 seconds every 30 seconds. They found that vapor temperature rose quickly in the first 5 to 10 minutes until reaching a steady state temperature at around the twentieth puff.

(意訳)5s/35sの頻度でpuffで実験。5~10分間に急速に温度が上昇し、20回目のパフほどで定常状態になりました。

引用:

https://newscenter.lbl.gov/2016/07/27/e-cigarettes-emit-harmful-chemicals-emit-others/

この記事は発がん性物質であるアクロレインの発生を危険視したものでありますが、まず普通はドライパフはしないので「コットンを焦がさない」ですし、ましてや「そのまま焚き続ける」ことはしません。定常状態の指すものを温度の変化しない状態ととらえましたが、通常それほどの高温の蒸気を吸引できません。

abc126cのノート

概要

一人でできた。

一応確率の問題だが、必要要素がわかれば実装はそこまで重くないのかもしれない

abc126c

atcoder.jp

計算量に余裕があったので愚直にできる。

105 < 217なので二倍し続けるのは最大で17回必要。

書いたコード

辞書型でk以上になるまでの必要回数をそれぞれカウントした。かける乗数ごとに集計している(コインを振る回数すなわち\frac{1}{2}が何乗必要か)

whileループ内でtmpがk以上になるまでかけ続け、行った回数を上記の通り集計した。

また、\frac{1}{n}は順序を入れ替え一番最後にかけている。

今思えば\frac{k}{2}以上は必然的に1なので最悪、処理を半分減らせることに気が付いた。

公式解説pdfを見ると、一つずつ確率を求めていた。計算量は変わらないが辞書型でいったん総量を取るのは蛇足だったかもしれない。

n,k = map(int,input().split())
d = {}
ans = 0

for i in range(18):
    d[i] = 0

for i in range(1,n+1):
    tmp = i
    c = 0
    while(tmp < k):
        c += 1
        tmp *= 2
    else:
        d[c] += 1
else:
    for ind,val in d.items():
        ans += val*(1/2)**ind
    
    print(ans/n)