カテゴリ: program

・日本語のストップワードは既に作られているので自作不要
https://qiita.com/y-s-y-s/items/c567117f0cf2be8c0acb
上記のslothlibはもう消えているので、以下を使う
https://qiita.com/picker/items/6c114b863134f4d6be88
・正規化モジュールneologdnについて
https://engineerblog.mynavi.jp/technology/nlp_stopword/
・サークル名は辞書登録した方が良さげ
https://qiita.com/nnahito/items/16c8e214d71fbc23ed8e
・辞書登録する際には読み仮名が必要なので読み仮名ライブラリ
https://note.com/dngri/n/n131eb5db725f
・Doc2Vecのチューニングパラメータ
https://deepage.net/machine_learning/2017/01/08/doc2vec.html


このエントリーをはてなブックマークに追加 mixiチェック

・1ジャンルの作品データを全部まとめて1つのTaggedDocumentとして学習すると数分で学習処理は終わるものの、判別が全然ダメ。
・タグを「ジャンル+作品タイトル」として個別の作品毎にTaggedDodumentとして学習させようとすると、メモリが全く足りない(全体の1/10位でメモリ使用量60GBに達する)。
ので、学習を複数回に分けて行いたい。
https://radimrehurek.com/gensim/auto_examples/tutorials/run_doc2vec_lee.html
をみると、
model = gensim.models.doc2vec.Doc2Vec(vector_size=50, min_count=2, epochs=40)
でインスタンス作成
model.build_vocab(train_corpus)
でコーパスを追加
model.train(train_corpus, total_examples=model.corpus_count, epochs=model.epochs)
でトレーニング
する模様。コーパス追加を複数回呼び出した場合、上書きになるのか追加になるのか、追加する手段はないか?を調査する必要がある。

https://radimrehurek.com/gensim/auto_examples/tutorials/run_doc2vec_lee.html
によると、modelのコンストラクタとは別に、
model.build_vocab(train_corpus)でコーパス追加
model.train()で学習(重み再計算)
らしい。できそう。
model = Doc2Vec.load(fname)  # you can continue training with the loaded model!
という記述もあるし、多分大丈夫だろう。
build_vocab()を2度呼び出して、model.dv['タグ']で検索して、追記した分とそれ以前の分の両方が返ってきたら、ちゃんと追記になっている事を確認できそう。

https://radimrehurek.com/gensim/models/doc2vec.html#gensim.models.doc2vec.Doc2Vec.build_vocab
によると、build_vocabのパラメータ「update」をtrueにすると追記になる模様。

★結局、コンストラクタはリストの他にファイルを指定できるようなので、一旦ファイルに吐き、それを読ませる方が良さげ
https://radimrehurek.com/gensim/models/doc2vec.html#gensim.models.doc2vec.Doc2Vec


このエントリーをはてなブックマークに追加 mixiチェック

以前一回成功したが今回は駄目だったので再掲。
結局、Anacondaのrootに入れるには
前回の手順で64bit版MeCaBをインストールしてPATHを通してコマンドラインから使えるようにしてから
・AnacondaのPowerShellからcondaでインストールしようとするとpin-1のコンフリクトで失敗。
・AnacondaのPowerShellからcondaではなくpipでインストール(pip install mecab-python3)したら
・Spyderやコマンドラインから、import MeCab を前提としたスクリプトは動作するようになった。
・gensimはcondaから普通にインストール(conda install gensim)成功

Pythonで学ぶ テキストマイニング入門
石田基広
シーアンドアール研究所
2022-08-13

このエントリーをはてなブックマークに追加 mixiチェック

PHPではどうもだいたいJSONのサイズが30MB超えるあたりからメモリ不足エラーで読み込みに失敗するようなので対応。
本当はJSONをストリーム扱いしてSAXのように処理すれば良いのだけれど、PHPに疎いのでそれは将来の課題として、差し当たりデータファイルをPHPとしてincludeしていた時代に作った、デカい時はsqlite3も作成してPHP側ではそれを読み込む処理を復活させてそれを活用。
一応仕込みはしたので後は30MBを超えた時の挙動を見れば大丈夫だろう。
全部sqlite3にすれば良いという話もあるけれどそれだと反映に時間かかるんだよね。
PHP Web Services: APIs for the Modern Web
Mitchell, Lorna Jane
O'Reilly Media
2016-01-21


このエントリーをはてなブックマークに追加 mixiチェック

JSONを読んで内容を表示するプログラムなんだけど、
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2097160 bytes) 
というのが出た。
さてどうしよう…。DBとかは使いたくないしな…。JSONを分割?

https://qiita.com/P2eFR6RU/items/9370011fe6cdb884769f に色々小技が。

組み込みだから
ini_set("memory_limit", "512M");
は厳しそうだな…。

小技もともかく、抜本的には今の、でかい単一JSONを一気に読んで処理、を改める必要ありそう。
「最初の100行だけ読む」とかできないものか…考えるだに無理そうだけど…。1データ1行のテキストにするとか…。
XMLで言うところのSAXみたいな、JSON Streaming Parser for PHPを使えば良いのかしら…。
PHPは専門外だがまぁ何とかなるだろう…。


このエントリーをはてなブックマークに追加 mixiチェック

iperf3はUDPモードだとジッタを測定できる。
このジッタの値はどうやって求めているか?を調べざるを得なくなったので渋々調べた。
iperf3 jitter calculationによると、どうもサーバ側から送信時刻を含んだRTPの電文を16回送信して、以下のように求めているとのこと。

In Reporter.c of Iperf 2.0.3 , the "jitter" designed to follow RFC 1889, Real Time Protocol (RTP):

            // from RFC 1889, Real Time Protocol (RTP) 
            // J = J + ( | D(i-1,i) | - J ) / 16 
            transit = TimeDifference( packet->packetTime, packet->sentTime );
            if ( data->lastTransit != 0.0 ) {
                deltaTransit = transit - data->lastTransit;
                if ( deltaTransit < 0.0 ) {
                    deltaTransit = -deltaTransit;
                }
                stats->jitter += (deltaTransit - stats->jitter) / (16.0);
            }
            data->lastTransit = transit;

so the key is "RFC 1889, Real Time Protocol (RTP)"


現在時刻ー電文中の送信時刻で通信に掛かった時間を求め、前回の電文の時間と比べて揺らぎを求め、その揺らぎの絶対値/16を加算していく…。
つまるところ、ばらつきの絶対値を合計して16で割ってるから分散…というか二乗していないので最後に√を取る必要が無いので、これは標準偏差なのか。
毎回加算しているのが平均との差分なのかちょっと納得いかないが標準偏差なのはいかにもあり得る話。


このエントリーをはてなブックマークに追加 mixiチェック

GMOのWiMAX2の「三日間で10GBまで」縛り回避のため、夜間バッチのFTPで送るJSON群をZIPにまとめ、一旦OCI上のVMに送信して、VM側でZIPを再びJSONに戻してそれをWEBサーバにFTPする方式にした。我が家からの送信量は大体1/13になったので今後は大丈夫だろう。
これも18日にドコモ光が開通するまでの辛抱なのでローカル側のバッチで一発自動化まではしないでよかんべ。
ただVM側の処理は簡単なのでシェルにする。
lftpでリモートディレクトリをローカルディレクトリの状態に同期させるスクリプトが以下。
ディレクトリ名の最後に/を付けてしまうと不味い事になる(指定したディレクトリの下にその名前で新規作成されたり)ので注意
-------
open ftp://ユーザ名:パスワード@ホスト名
mirror --parallel=2 --only-existing -R ローカルディレクトリ名 リモートディレクトリ名
close
exit
------
FTPサ-バ構築ガイド (A nutshell handbook)
Adrian Nye
オライリー・ジャパン
1996-10-30


このエントリーをはてなブックマークに追加 mixiチェック

接続はできた。
投稿には「1 label has been placed on this content」というのが勝手につけられた。
「ポルノグラフィ」だそうな。マジか。
ともあれ、ラベルを付けるだけなら投稿しても問題無さげ?…かどうかは分からない。BANに備えて3月の、メアドだけでアカウントが作れた時期に10個位作っておくべきだった。

0408
0408b

このエントリーをはてなブックマークに追加 mixiチェック

TiwtterやMastodonと違い、BlueSkyのOGPカードに表示するタイトルや説明、画像はクライアントが準備してPOSTする時に沿えてやらねばならない。
その場合の画像のフォーマットはJPEGは駄目、PNGは大丈夫だった。JPEGデータだと以下のようなエラーが返ってくる。
BadRequestError: Response(success=False, status_code=400, content=XrpcError(error='InvalidMimeType', message='Wrong type of file. It is */* but it must match image/*.'), headers={'Date': 'Sat, 23 Mar 2024 14:55:59 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '96', 'Connection': 'keep-alive', 'X-Powered-By': 'Express', 'Access-Control-Allow-Origin': '*', 'RateLimit-Limit': '5000', 'RateLimit-Remaining': '4997', 'RateLimit-Reset': '1711209359', 'RateLimit-Policy': '5000;w=3600', 'ETag': 'W/"60-naTgCWHhjZ5FGkdXs552SxW2Nug"', 'Vary': 'Accept-Encoding'})

メモ:Pythonで画像フォーマットを変換するにはPillowを使う模様
https://note.nkmk.me/python-pillow-basic/


このエントリーをはてなブックマークに追加 mixiチェック

1.Nostrには「クライアントが表示する前にユーザにワンクッション置かせる指定」の規格NIP-36があるのでそれを設定する。
2.iPad用のメジャーなNostrクライアント、Damusは上記のNIP-36に対応しておらず、代わりにハッシュタグ「#nsfw」を見ているらしいので、それを付けるのが親切。
3.ハッシュタグ(NIP-12)は本文中にTwitter同様「#hoge」等と記載し、更にtag「t」を使う。tのvalueには「#」は含めない
4.画像を添付したい時は、インターネット上のどこかに画像をアップロードしてその画像のURIを本文中に含める

つまりはこう





このエントリーをはてなブックマークに追加 mixiチェック

↑このページのトップヘ