メモ書き:Random

例えば、今日食べる物とかテキトーに決めたいことあるよネ!そんな時はこれだヨ!random!
………いやこの前振りはあまりにも雑だな。カロリーメイトとかCompがすべてを解決してくれるから迷う必要ないわ。


randomのメモ書きです。例のごとく私が使うものしか書いてません。

import

import random

元から入ってるのでpipやらcondaやらpuipuiやらなんやらはない。


なんか一つ選んで。

e = [0, 556, 777, 1000]
random.choice(e)

リスト、タプルでこれはできるがdictやsetではできない。(それはそう)

r = {"Atri":"Natsuki", "Glare":"User", "Lucy","Master"}

#Random Key:
random.choice(list(r.keys()))
#Value
random.choice(list(r.values()))
#Key&Value
random.choice(list(r.items()))

辞書でやるならこうがまるいって以前どこかで見た。

A = "DAMNATION"
random.choice(A)

文字列でこれを行うとどれか一つの文字を取り出す。


いくつか選んで。

A = ["黒殻","巡礼","異神","日輪","永夢","蝕獣","魔女","終涙","無銘"]
print(random.sample(A, 4))
print(random.choices(A, k=4))
print(random.choices(A, k=10))
['永夢', '魔女', '黒殻', '日輪']
['日輪', '蝕獣', '魔女', '蝕獣']
['永夢', '終涙', '黒殻', '日輪', '永夢', '黒殻', '巡礼', '終涙', '無銘', '巡礼']

sampleだと重複なしで指定数、choicesだと重複有でk個ランダムで取り出す。どうやらkは指定しないといけないらしい(伝聞)
sampleは重複なしではあるが、リストなどに同一の値が入っているとき同じ値が出てきたりする。
choicesのkは抽出元の要素数より多くできるが、sampleではできない。

d = "luna-eclipse"
print(random.sample(d, 4))
['l', 'n', '-', 'l']

文字列でもできる。
sampleの「重複なしではあるが、リストなどに同一の値が入っているとき同じ値が出てきたりする」という例でもある。

weightsを指定すると重み付けありきのランダム抽出ができるらしい。

import random
p = random.sample(L)
L.remove(p)

とかするんだっけ?何に使おうとしたのか知らないけど。

乱数生成1(int)

random.randint(2855, 2859)

整数の乱数を生成する。この場合、生成される可能性がある乱数は2855, 2856, 2857, 2858, 2859


乱数生成2(float)

random.random()

0~1の間のfloat乱数

print(random.uniform(33.4, 2005))

指定した2つの数字の間のfloat乱数。指定する2つの数字はfloatでもintでもいい。


乱数シード値

random.seed(271)

並び替え

l=["É","p","é","e","L","i","o","n"]
l2 = random.sample(l, len(l))

他にも方法はあるけど……

書き残し&余談

確かだけど、正規分布に基づく乱数とかそんな感じのがいくつかあったはず。今は使ってないけどいつかどこかで使いそうな気はしてるし使うときに書くんじゃないですかね。
それから余談。このコード群、4と10以外全て元ネタがあります。全部わかったら私に言ってください。全問正解していた場合、要注意人物として注意リストに叩き込んで差し上げます。そんなに難しくないのですがわざわざこんなことろまで見に来てかつ全問正解する者がいるとは思っていません。

メモ書き:斧頭氷杖だか漬物だかなんだか(pickle)

pythonのpickleの話です。
正直、どういうときに使うものなのかよくらからない。いや、分からないこともないこともないんですけどね。ええ。まあその話は下の方で書くとしまして。

ファイルに保存

import pickle
sepblectus = {"r":"", "o":"", "y":"", "g":"", "b":"Celen", "i":"Kya", "v":"Amy"}
with open("sep.pickle", "wb") as f:
    pickle.dump(sepblectus, f)

pythonオブジェクトならなんでもいい(らしい)。
調べたところ、どうやら別にバイナリモードで保存しなければいけないわけではないらしい。ずいぶん遠回しな書き方ですね。
簡単に言うと「バイナリモードの方が推奨されるのでそっちでやれ。あ、でも強制じゃないよ。」ってわけ。

読み込み

import pickle
with open("sep.pickle","rb") as f:
    d = pickle.load(f)
print(d)
{'r': '', 'o': '', 'y': '', 'g': '', 'b': 'Celen', 'i': 'Kya', 'v': 'Amy'}

「EOFError: Ran out of input」が表示された

pickle用に保存したファイルが空だった時にでるエラーらしい。そげなバカな………!?と思ってファイル確認したらたしかにファイルサイズが0kbだった。(原因未調査)
対処法がここに書いてあるような書いていないような気がしたけどあんまりしっくりこなかったので記憶貯蔵庫には書かない。

で、どういうときに使うの?

平たく言うと、Pythonオブジェクトをファイルとして保存し、呼び出せるようにすることができる形にするためのライブラリという事になります。

分かるようで分かりませんわ。分かるんだけど、完全に理解にしたにならないんですの。

DataFrameと使うときの注意

pandasのDataFrameをpickle化した後,pandasまたはPythonのバージョンを上げると,このpickleをloadした際に以下の様なエラーが起きることがあります.
ModuleNotFoundError: No module named 'pandas.indexes'

引用元:
https://estuarine.jp/2017/07/pickle_pandas_error/
なんかエラーはいたんだけど???ってなったので調べたらそういうことらしい。

pickle.UnpicklingError

こういうエラーがあるっぽい。調査中。
私の環境下で出たのは「invalid load key, '\x00'.」だった。
https://teratail.com/questions/154262
https://stackoverflow.com/questions/73056948/pickle-unpicklingerror-invalid-load-key-x00
いろいろ探しても「適切に保存されていない可能性がある」くらいしか出てこない。そういうものなのかも。
load keyにあたるものもいくつか種類があるようで。

基本放置させるものにはこれ用の例外処理とか書いておいた方が安全かもしれないと思った。

    try:
        with open (file,"rb") as f:
            status = pickle.load(f)
    except pickle.UnpicklingError:
        ErrorFileList.append(file)
        
    else:
        media = status.entities.get("media")

みたいな。

関数を読み込む?(メモ)

importしてるモジュールの関数は別モジュールから正しく呼べる
同じモジュール内の関数は同名の関数が呼ばれる

なお、test1.pyでtest1.pyをimportして、test1.funcをpickle保存すれば正しく読み込めるようになります。

qiita.com

推測(未確認)
  1. importで読み込んだ関数はpickleに保存して、読み込める
  2. importしていない関数はpickleに関数名のみ保存される
  3. そのため、 importしていない関数をpickle.load()→実行をすると、同名の関数が適用される
  4. 同様に、 importしていない関数をpickle.load()→実行をすると、同名の関数がない場合NameError: name 任意 is not definedになる

vs CUDA ~リターンズ

概要

簡単にまとめると、全部破壊してtensorflowでGPU使えるようにしました。
結論から言うとpython3.7、CUDA10.1、tensorflow-gpuは2.3.0です。あ、もしかしてこれだけでオチ分かった?

事の起こり

CUDAだけ入れておいてcuDNN入れ忘れたなーって思って始まりました。
前回のアレのとき、入れ直さずして何とかなったのはTF(tensorflowのこと。Team FortressでもTwisted FateでもTransformationでもTrue or Falseでもないよ。)使って学習はしなかったからです。詳しく話すと長いので略。

from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())

私「GPU、使ってるよね?」
PCくん「CPUやよ」
私「どうして」
PCくん「知らんよ」
私「CUDAあるよね?」

nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Sun_Jul_28_19:12:52_Pacific_Daylight_Time_2019
Cuda compilation tools, release 10.1, V10.1.243

PCくん「前も聞いてきたよね」
私「あ、cuDNNのバージョンは?(参考)」
PCくん「そんなファイル、覚えがないヨ!」

面接は以上となります。

cuDNNを入れます

ダウンロードしたらzipファイルを解凍して適当な場所に展開します。
場所はどこでも構いませんが、TensorFlowの手順に合わせるのであれば「C:\tools\cuda\bin」に「cuDNN64_7.dll」が含まれるように解凍します。

引用元
って聞いたのでそこに入れます。そろそろCドライブというかSSDの容量やばいですわ。
んで、PATHを通します。

うん、あっさり。
苦戦した記憶、そういえばありませんわね。

それでもどうにもうまくいかない

もっかいCUDAの入れ直し、やる?

苦行、再び。

(必要ならBGM)
じゃ、私はHelltakerのBGM聴きながら作業するので….......

エラー

Running Processes
The following processes must be stopped before the CUDA Visual Studio Integration installation can procees:
Monitor

あっ。
モニターで使っているなら仕方なぁいね。
.......ちょっとマチア待ってくださいな?以前インストールしたとき、そういえばそんなのなかった気がしますわ?

Monitor.exe

タスクマネージャーを開きました。
Monitor.exe
(\ASUS\GPU TweakII)
あっ、これかぁ。名前紛らわしいんじゃ。
そういえばグラボ変えたときに入れたかもしれませんね。

コイツをkillします。

PCくん「Visual Studio Integrationのインストールに失敗したヨ!」

多分これよくあるエラーだった気がしますわ。記憶にあります。
カスタムインストールをすれば解決しましてよ!
カスタムインストールに設定して、ドライバーコンポーネントを選択する画面で、CUDA内Visual Studio Integrationのチェックを外せばよろしくてよ!
たぶんそこかしこでいろんな人が言っておりますわ。みんなで渡れば赤信号だって怖くないように問題ありませんわ!

2022/7/2追記

まだやってるのかよ。
CUDA10からCUDA11に変えようとしてまだ苦しんでいます。
nsight visual studio editionとかいうものをインストールできないのでカスタムでこれ関連のものを無視してインストールするようにした。

あとこのサイトとかもしかしたら参考になるかも。
tecsingularity.com

インストール完了したけど.......

もう一度PCくんにGPUで計算できるようになったか尋ねます。

from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())

これですね。
PCくん「う~ん、無理!w」
どうして。

対応表

そういえばtensorflow-gpu、テキトーにインストールしてた気がする。
www.tensorflow.org
これだわ。

pip install tensorflow-gpu==バージョン

でどうこうします。

動きました。

まとめ

CUDAインストール、cuDNN(CUDAにバージョンを合わせる)、tensorflow-gpuのバージョンを合わせると順番にしばきまわすことができたので解決しました。

雑記20210521「欠損因子」

これですか?これは雑記です。某ゲームの話ではないです。ギャンブルが怖いのでやっていませんし。
え?ソシャゲはギャンブル?知ってる。もう増やさないって誓ったッ………
魔道杯の季節が近づいたので思い出したかのように書きます。いえ思い出したので書いています。


良く、「あの人は負けず嫌いだ」って言うじゃないですか。おかしな言葉だと思いませんか?
あ、「別に『負けず』の「ず」が打消しの意味だからおかしいよね!」っちゅう話じゃあないんですわ。

それに関しては「負けじ」って言葉が変わったとか云々って調べれば簡単に出てきます。出てきました。
https://www.nhk.or.jp/bunken/summary/kotoba/term/055.html
NHKだから多分これソースとしてこれ一つで十分でしょ。


話し戻しちゃいますね。「負けず嫌い」なんですけど、意味はいいですよね。「他人に負けることを嫌う勝気な性質であること。」まぁ「負けるのが嫌い」って意味ですよね。馬鹿にしてるんですか?いいえ、しておりませんわ。え?口調がバカにしてそう?豊かな考えをお持ちですわね(はんなり)。まあいいでしょう。

なぁんかもやもやするんですよ。私、結構負けず嫌いだとは思うんです。信じられないくらいには。
どれくらいかって?現世で私よりも負けず嫌いな人を見たことがないくらいに。
ただ、私がものすごーい人か、そんなことはないです。
私と付き合い長い存在は以前どこかで見たかもしれません。赤点、というかテストで0点取ったことあります。学力の偏差値に至っては50落としたことがあります。(補足しますが、これは自己最高との比較です。理科もしくは社会と物理だったかな、忘れました。)
さてさて、これは結構私の根底にあることだと思っているエピソードです。昔、サッカーみたいな遊びをしていました。(みたいな、というのはしっかりとしたルールに基づくものではなかったからです。)その遊んでいたグループの中で、私は運動神経はよくありませんでした。かといって悪くもなかったのですが、少なくとも一番良かったということはありえなかったでしょう。さて、「負けず嫌い」でしたらどうしますか?走り込みをしますか?筋トレをしますか?
私がどうしたのかの答えは後で書きます。


負けず嫌いに関してなんやかんやあった論文があったのでなんかで読みました。
論文:
https://www.jstage.jst.go.jp/article/jraps/28/1/28_KJ00004841627/_article/-char/ja/
「小学校児童における負けず嫌いの積極的意味を探求する」渡辺弘純,土井直子

スポーツテストでは他の人よりも高い得点をあげたい
テストやスポーツにおいて負けたくない人がいる
テストで友だちに負けるとくやしい
みんなから「すごい」と思われたい

ええ、ありますあります。

ドリルやプリントは自分ができるようになるために一生懸命にする
テストの点が良かった時はみんなの前で発表してほしい
宿題は自分の力で頑張りたい
自分が好きでもないことも宿題なら一生懸命する
試合や本番のために自分から練習する
テストの点が友達より悪いとくやしい※
ゲームやテストで友だちに負けるとくやしい※
テストで友だちに負けるとくやしい※

いいえ、まったく。
私には、こっちがあんまりないんですよね。論文の命名に従って書きますが、「頑張り因子」それから「くやしさ因子」、どうやら私の中から欠損しているようで。私の中にあるかどうか中途半端な因子もあるようですが。

「負けず嫌い」が、他者と比較して優位に立つことと自己向上への強い志向性から成り立つと想定して尺度構成を進めた。因子分析の結果は、4つの因子、すなわち、他者より優位でありたいとする志向(優位)、他者から賞賛を得たいという願望(賞賛)、自分を高めようとする自己向上の意思(自己向上)、及びくやしさの感情(くやしさ)から成り立っていることを示した。
{中略}
(1)他者に負けたくないという意識が、優位であることを目標にする因子として現れること、(2)この優位と自己向上の融合から、賞賛を得ることを目指す因子が生まれること、(3)自己向上は、これらの(1)と(2)の上に、独立した因子として打ち立てられること、及び(4)「負けず嫌い」には感情が伴うこと、を示している資料であると読み取ることができる。

不思議ですね。いえ、分かりますよ。世間一般の「負けず嫌い」はそうなんでしょう?分かってます。「負けず嫌い」というより努力家なんじゃないかと思っていますよ。昔から。
別に私を負けず嫌いだと認めてほしいわけじゃあないんですよ。なんていうんですかね、「ハロウィンだからコスプレして集まろうね!」って言われてジェイソン・ボーヒーズの格好していったら、他の人は不思議の国のアリスとか鬼滅の刃とかリゼロのレムラムとかのコスプレしてた時の気分なんですよ。


さて、さっきのお話です。
そのサッカー的な遊びをしていたころ、小学生にすらなっていない年齢ですので、筋トレだとか走り込みだとかは思いついたとしてもできなかったでしょう。そして多分、今の私の知性を持っていても同じ選択をしたと思います。私は審判をするという選択をしていました。勝てないならルールを作ればいいじゃないですか。
別にズルではないでしょう?卑怯?結構。
真っ向から戦いたくなんてないです、勝てるところで戦うように引きずり込めばいいじゃないですか。江戸で戦って勝てないなら長崎で戦えばいいじゃないですか。あ、そういうことわざじゃない?



ただ、逃げ続けた結果、今の私のあり様なんだろうなぁとも思いますがね。後悔は今はまだしていませんけど。




余談
それはそれとして、思考の因子が欠損してるって言うとなんかいい響きじゃない?自分がかわいかったら喜んでる。かわいくないので別に………ってなりますけど。

CUDAが入らなかったり入っていたりしてしまった話

うちのPCはGTX1080だからかもうディープラーニングができるのよ?
親が愚かなのでディープラーニングの用意してませんけど。

というわけでディープラーニングはともかく、機械学習っぽいことをやろうかなって思ったり思わなかったりしたのでそれの準備。
3億回くらい環境作って破壊して、環境破壊は気持ちイイZOY☆してたのでまた環境の作り直しです。なんで環境破壊したんだっけ。

はじめに

結論から言うと、初めてCUDAインストールしようとする人、同様に、未来の私へ。この記事は役に立ちません。
他を当たってください。

過去の私は使い物になりません。

起きたこと

import tensorflow as tf
ImportError: Could not find 'cudart64_90.dll'. TensorFlow requires that this DLL be installed in a directory that is named in your %PATH% environment variable. Download and install CUDA 9.0 from this URL: https://developer.nvidia.com/cuda-toolkit

よく見る光景。
かつてやったような気がするけど忘れたのでやり直しつつ記憶貯蔵庫に残しておく。(多分やった環境破壊したような気もする)

CUDAのインストール(失敗)

developer.nvidia.com
ここから欲しいものを持ってきた。

f:id:Amesiorine271108:20210517034923p:plain
血を吐くほど見た光景

8那由多回くらいこのインストーラーのエラーを見たような気がする。
同意して高速インストールを選んだ。

・・・

・・・

返事がない・・・・・・・。
どのくらい返事がないかというと高速インストール選んでからここまでの文章全て入力するくらいには返事がない。
今確認したけど、戻るも進むもキャンセルもなぜか押せるけど無。
これが虚無ですか。まるで将棋だな。ソシャゲか。
ええ、動いているはずなんです。Reminiscence聞きながらでも、ちゃあんとCefaSipoくんから、…...ブウウ――ンン――ンンン………...って聞こえるから。あ、CefaSipoってのはうちのPC君の名前です。ブログにまともな名前つけてないですけど持ち物に名前を付けるのは当然でしょう?ほら、持ち物には名前をつけなさいって小学校で言われたでしょう?いわれてない?私も言われてないかも。覚えておりませんわ。
不安になってタスクマネージャー起動しました。電力消費が非常に高いといっておりますの。無駄飯喰らいか?主に似ておるな。鬱になりそう。
おや、ご質問ですか?Reminiscenceってなんですか?ご質問ありがとうございます、こちらは最近ドハマりしているゲームのBGMですわ。もう別の曲に切り替わってしまっていましてよ。ところでドグラマグラの…...ブウウ――ンン――ンンン………...の表記ってどうだったっけ?って思って検索したんだけど、イナイレのなんかが出てきて見つからなかったんですけどこれはなんなんすかね。「栗末、嫌われる理由」とかサジェストに出てきましたよ。なにこれ。なんでもいいや。暇なので虚無の文章書いているんですけど飽きてきました。今聞いてる曲終わったら再起動かけますかね。Prison、あのゲームで一番最初に気に入ったBGMですわ。今の気分だとFlameの次に好き。恵羽千だいすきか?あ、曲終わったわ。
長いこと待ったけど進まず。何がいけなかったんすかね?私の頭?
また無駄な文章書くの?そろそろ飽きたんだけど。それでさっきの話なんですけど、でも一番好きなのフェレスだから.......。

今度は数秒で終わったわ。

NVIDIAインストーラーが失敗しました

f:id:Amesiorine271108:20210517042529p:plain
はぁ、俺...HDMIPTSDかもしれない.......。
nvidiaインストーラーが失敗しました cuda」で検索掛けたら全部リンクが過去にアクセスしたことを示す紫色になってるんだけど。
参考
ここを参考にしながらそれっぽ~くやります。IME重くなったんだけどこれ大丈夫かな。NVIDIA GeForce Experienceのせいか。

やったこと
  • NVIDIA GeForce Experienceのアップデート
  • 「C:\Program Files\NVIDIA Corporation」と「C:\Program Files\NVIDIA GPU Computing Toolkit」の消せるもの全て削除
  • んでもってもっかいインストール

271108「またインストーラーが虚無になったけど大丈夫かな・・・。」
CefaSipoくん「うん、ダメダメだネ!」

しばく。

全アンインストール、いろいろと影響出そうだからやりたくないんよね・・・。

環境復元、できない?

環境作ってとりあえずダメ元テストってことで、ごみ箱に破壊した環境があるのでそれから復元できないか試す。
記憶が確かならばpython3.7でTF2を動かしていたような気がする。CUDAは10だったかな。9じゃダメで苦戦したような。
→いろいろ試そうとしたけど、復元できなかった。仕方がないので新しく作る。

271108.hatenablog.com

それはそれとして、CUDAって入ってるの?

nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Sun_Jul_28_19:12:52_Pacific_Daylight_Time_2019
Cuda compilation tools, release 10.1, V10.1.243

………なるほど?
10.1のCUDAがどうやら入っているらしい。多分昔やったんだろうね。

ダメ元テスト

f:id:Amesiorine271108:20210517061053p:plain

動くのか・・・。

伝えれば

事前に

偏差値3なので大昔、一番最初に読んだ本がマルコフ辞書って称してたのでマルコフ辞書って言い続けています。あんまりn-gramとの違いを理解しきっていない節があるので誰かが補足してくれたらありがたかったりします。誰がするんだろう。

考えたこと

  • なんか問題あったら将来の私がブチギレながら直してくれるさ。
  • 使うか分からないけれど文章辞書(SD)の保管
  • もしかしたらランダムで単語辞書(WD)の品詞分類を基に単語を入れ替えるかもしれないので気持ちマルコフ辞書は細かくてもいいかも
  • 同様の理由で、単語の出現率の記憶は保持しなくてもいいかも?←本当に?
  • しれっとWDの1と2をBOS、EOSに変更した。これで生成の時、BOSとEOSが分かりやすくなる………はず。
  • 検索を楽にやりたいから、マルコフ辞書(MD)の形を、キーをタプル、アイテムをリストにする
  • それに伴い、新しくMDに追加するときはlen()=1のリストの形で入れる

忘れかけたこと

Q「SD/MDの数字ってなんだっけ?」
A「WDの単語番号です」

次回以降に回したこと

  • 単語を入れ替える
  • ユーザー辞書を作る・使う

→正直これしんどい

今回やること

  1. 辞書を作る
  2. 適当に生成してみる

辞書を作る

WD = {1:{'w': '<BOS>', 'pron': '', 'PoSp': ['BOS/EOS', '*', '*', '*', '*', 'BOS/EOS']},
      2:{'w': '<EOS>', 'pron': '', 'PoSp': ['BOS/EOS', '*', '*', '*', '*', 'BOS/EOS']}} #単語辞書
SD = {} #文章辞書
MD = {} #マルコフ

texts = ["ロボットは人間に危害を加えてはならない。また、その危険を看過することによって、人間に危害を及ぼしてはならない。","ロボットは人間にあたえられた命令に服従しなければならない。ただし、あたえられた命令が、第一条に反する場合は、この限りでない。","ロボットは、前掲第一条および第二条に反するおそれのないかぎり、自己をまもらなければならない。"]

from sudachipy import tokenizer
from sudachipy import dictionary
tokenizer_obj = dictionary.Dictionary().create()

def tokenize(x):
    sen = []
    voidwordlist = ("補助記号","記号","空白")
    dic = {"w":"<BOS>","pron":"","PoSp":["BOS/EOS", "*", '*', '*', '*', "BOS/EOS"]}
    sen.append(dic)
    for y in tokenizer_obj.tokenize(x, tokenizer.Tokenizer.SplitMode.C):
        dic = {}
        dic["w"] = y.surface()
        if y.part_of_speech()[0] in voidwordlist:
            dic["pron"] = ""
        else:
            dic["pron"] = y.reading_form()
            
        dic["PoSp"] = y.part_of_speech()
        sen.append(dic)
    dic = {"w":"<EOS>","pron":"","PoSp":["BOS/EOS", "*", '*', '*', '*', "BOS/EOS"]}
    sen.append(dic)
    
    return sen

def RSearch(dic,q):
    item = [k for k, v in dic.items() if v == q]
    return item[0]


for text in texts:
    sen = tokenize(text)
    sd = []
    for x in sen:
        if x in WD.values():
            ID = RSearch(WD,x)
        else:
            ID = len(WD)+1
            WD[ID] = x
        sd.append(ID)
    SD[len(SD)+1] = sd


def MDAppend(k,i,MD):
    if k in MD:
        if i not in MD[k]:
            MD[k].append(i)
    else:
        MD[k] = [i]

for x in SD:
    s = SD[x]
    if len(s) < 5:
        pass
    else:
        m0 = s[0]
        m1 = s[1]
        m2 = s[2]
        m3 = s[3]
        m4 = s[4]
        MDAppend((m0,m1,m2,m3),m4,MD)
        for y in range(5,len(s)):
            m0 = m1
            m1 = m2
            m2 = m3
            m3 = m4
            m4 = s[y]
            MDAppend((m0,m1,m2,m3),m4,MD)

生成する

start = []
for x in MD.keys():
    if 1 in x:
        start.append(x)

ここダサい。

import random
start = random.choice(start)
OT = list(start)
w = 0
while w!= 2:
    w = random.choice(MD[tuple(OT[-4:])])
    OT.append(w)

output = ""
for w in OT:
    output += WD[w]["w"]
print(output)
f:id:Amesiorine271108:20210512160100p:plain
出力結果

じゃあ本格的にやってみよう

手元にたまたまあった、16140ツイートをまるっとぺろっと食わせました。
ただし、ツイートなので5単語より少ないものが存在します。見ての通りこれらは今の状態では餌になっていません。

f:id:Amesiorine271108:20210512165101p:plain
残念ながらそのままの発言っぽいものが多い

残念ながらそのままの発言っぽいものが多い。まあ予想通りというか当然なんだけれど。

→白猫の話。同一のツイートがあった。

  • やっぱパルスと戦うの苦手だわ

真空管ドールズの話。同一のツイートがあった。

  • そういえばSkype迷言タグってどんなのでしたっけ

→同一のツイートがあった。

  • ひえっ、やっぱ五式じゃあ時代遅れになっちゃってるのかなぁ

→黒ウィズ、魔道杯の話。魔道杯期間であり当時は六式が一番上か。同一のツイートがあった。

  • ハツセなしキュウマなしアルさんなしは無理ですね

→黒ウィズ、魔道杯の話。上のツイートと似たような時期にツイートしている。

  • そうだね、と頷いて君はクォカードに魔力込めた

→一時期流行っていたクォのQUOカード出たら面白いよねみたいな話題。同一のツイートがあった。

私の相互さんでどこまで私の例のTwitterアカウント知ってるんでしたっけ
→日本語が怪しいが、同一のツイートがあった。

  • 池袋にバッカレイさんはいますか?

→どういう文脈か分からないが黒ウィズ、魔轟三鉄傑の話か。同一のツイートがあった。

  • 二時までにメロウマナ終わりそう

→黒ウィズ、メロウを108匹集めていた話。同一のツイートがあった。

  • ポテチに使われている粉末味噌って何

→粉末の味噌なんでしょう。同一のツイートがあった。

  • あんまり食べたいって思うことがないんだけどなあ

ものすごく自然な文章だが、同じツイートはない。

  • 正直、あの兄妹がバレンタインとかでひょっこり出てきて笑う

多分黒ウィズの話。どの兄妹なんでしょうか。ちょっとおかしいが同じツイートはない。

  • ASSS封印無効って正直壊れ潜在だと思う

→黒ウィズの話。スペシャルスキルなのでSS封印と呼ぶ層がいたのを覚えていますか?同一のツイートがあった。

  • 潜在でAT800上がるのに勝てないって怖い

→黒ウィズだがどの精霊の話か分からない。同一のツイートがあった。

  • 月堕撃破ぁ!

→黒ウィズ、HereticBladerの話。同一のツイートがあった。

  • 八百万は…ねぇ

黒ウィズの話かと思ったが、同じツイートはなかった。

  • スザクのキワム以外の誰かに作ってもらってましたまたは作ってもらっています

同じツイートはなかった。別に異界転生したわけではないです。

  • あー、その二人いがいだと……なんで効かないんですかねぇボーダー

ちょっとおかしいが同じツイートはない。

  • タイトルを把握していない気はしますが。

同じツイートはなかった。タイトルくらい把握してほしいが。

  • あとはドルキマスかなぁ元帥が元帥してた。

→黒ウィズの話。同一のツイートがあった。



まあ十分なんじゃないですかね、じゃあ単語入れ替えとかそこらへんは次回で。

気持ちで

言葉ってめんどくさい。色とか、気持ちで伝えればいいのに。

前回
271108.hatenablog.com
前々回かもしれないやつ
271108.hatenablog.com



参考
qiita.com


sqlite3使ってデータベースでなんやかんややろうと思いましたが後回しにしました(愚かなので)

辞書でいいや・・・・・(愚かなので)


試作段階の雑コード

from sudachipy import tokenizer
from sudachipy import dictionary
tokenizer_obj = dictionary.Dictionary().create()

def tokenize(x):
    sen = []
    voidwordlist = ("補助記号","記号","空白")
    dic = {"w":"<BOS>","pron":"","PoSp":["BOS/EOS", "*", '*', '*', '*', "BOS/EOS"]}
    sen.append(dic)
    for y in tokenizer_obj.tokenize(x, tokenizer.Tokenizer.SplitMode.C):
        dic = {}
        dic["w"] = y.surface()
        if y.part_of_speech()[0] in voidwordlist:
            dic["pron"] = ""
        else:
            dic["pron"] = y.reading_form()
            
        dic["PoSp"] = y.part_of_speech()
        sen.append(dic)
    dic = {"w":"<EOS>","pron":"","PoSp":["BOS/EOS", "*", '*', '*', '*', "BOS/EOS"]}
    sen.append(dic)
    
    return sen

def RSearch(dic,q):
    item = [k for k, v in dic.items() if v == q]
    return item[0]



texts = [ここに何かを入れるかもしれないし入れないかもしれない]


for text in texts:
    sen = tokenize(text)
    sd = []
    for x in sen:
        if x in WD.values():
            ID = RSearch(WD,x)
        else:
            ID = len(WD)+1
            WD[ID] = x
        sd.append(ID)
    SD[len(SD)+1] = sd


ここからやること
・SDからマルコフ辞書を作る
・マルコフ辞書から文章を作る
・ピックスだかピッケルだかピクルだかで辞書の保管するやつを書く

もしかしたらやるかもしれないこと
・ユーザー辞書を作るかもしれない
ユーザー辞書関連↓
https://github.com/WorksApplications/Sudachi/blob/develop/docs/user_dict.md