カテゴリ: python

自然言語処理の前処理については、図書館で借りて来た後述の2つの書籍に詳しい記載があった。いや人工知能ブームだけあって機械学習本は沢山ありますな。
どちらかと言うと「15ステップで踏破…」の方がMeCaBへの辞書登録のやり方やユニコード正規化とかまで書いてあって便利かな。
正規化処理をまとめて行ってくれるneologdnはcondaからはインストールできないのでpipから。
pipからのインストールにはVC++のインストールが事前に必要なので注意。

あと、どうも結局、MeCaBのコンストラクタにファイルを指定する場合はタグは行番号にしかならない模様。





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

・日本語のストップワードは既に作られているので自作不要
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チェック

---
import xml.etree.ElementTree as ET
from xml.dom import minidom
(略)
tree = ET.parse(xmlfile)
root = tree.getroot()
(略)
doc = minidom.parseString(ET.tostring(root, 'utf-8'))
with open(xmlfile, 'w', encoding='utf-8') as f:
    doc.writexml(f, encoding='utf-8', newl='\n', indent='', addindent='  ')
---
を繰り返すとXMLファイル中に謎の改行が増えまくるでござるの巻。

たしかPythonはWindowsだと\r\nの関係で改行が倍になる馬鹿者な動作があったような…。
書き出しの所を以下にしたらだいぶマシになったがまだ残るな…。
----
xmlstr = ET.tostring(root, 'utf-8').decode()
xmlstr2 = xmlstr.replace('\n', '').replace('\r','').replace('\t','').replace('  ','')
doc = minidom.parseString(xmlstr2)
with open(xmlfile, 'w', encoding='utf-8') as f:
    doc.writexml(f, encoding='utf-8', newl='\n', indent='', addindent='  ')
----

余りやるとLinux上で動かした時に何か不味そうなのでこの辺にしておくか

Python & XML: XML Processing with Python (English Edition)
Fred L., Jr Drake
O'Reilly Media
2013-11-12


このエントリーをはてなブックマークに追加 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チェック

クローリングする先のサイトのHTML変更に合わせて解析箇所も随時追従しないといけないんだけどサボってた。
HTMLは直接解析は中々厳しいので、HTMLCleanerで一旦XMLにして、それを解析するのが楽。
Pythonは数人以上でとりくむような代物だとやってられないけれど、この程度の処理だとJavaよりも楽ですな。全部設定ファイルなので引数を受け取る処理が先ず不要になるし。

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

「標準ライブラリ内でよく落ちる」「原因は離れた箇所のショボいTypo」
今までJavaが多かったんだけど最近諸事情によりPythonを見ないといけなくなったので適当に調べつつやっている。まぁ何か見た感じ文法が似ているし別にMCなシステムでもないショボいツールなので何とかなるだろうと。
使っているうちに感じるこの、Javaプログラミングと違いPythonプログラミングがC言語プログラミングに似ている冒頭のこの感じ…。
Javaだとさ、例えばぬるぽで落ちると実際にその行のコードで使ってるオブジェクトがnullである事が殆ど。他のExceptionが起きた時も大体、何というか、処理が停止した個所と実際に問題のあるコードは近い訳ですよ。
ところがC言語だと必ずしもそうではなくmemcpyやstrcpyでcore吐いて落ちたからといってmemcpyやstrcpyに問題がある事は滅多になく、それら標準ライブラリに渡す変数が悪い訳でもなく、実は原因は一見全然関係ない別の処理が変数領域を壊していたりすることがしばしばありデバッグは結構難しい。
Pythonはスクリプト言語なのでcoreを吐くと言う事は無いのだけれど、使ってみると意外にもJavaよりもC言語に近い感触がある。落ちる個所と、問題のある記述が遠い…というかさっぱり分からないのでコードを削りつつ実行して怪しい箇所を絞り込んでいく作業をしていると「お、これは昔、Cで散々やったアレだ…」と思い出した。
見つけた原因も「えー、これコンパイルで検出してよ…いや間違えたのはこっちだけど…」というようなショボいTypoばかりで、よくこれで標準ライブラリを落とせたな…。
やっぱ冗長とは言われつつもJavaの方がデバッグは楽ですよ。コーディングが楽な方が良いかデバッグが楽な方が良いか、切羽詰まる感じはどちらかは、明らか。
ちなみにC++だとショボいTypoで全然関係無さげなSTLやヘッダが山ほどコンパイルエラーを起こすのでアレも嫌いだが。

Pythonライブラリの教科書
立山 秀利
日経BP
2023-03-17

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

dataclassのメンバーに自前の構造体を使ってそれを初期化したい時。

@dataclass
class Item:
    value: str=''
    pos: int=0

@dataclass
class MyInfo:
    name: Item =Item('',0,'')) 
    parent: Item =Item('',0,'')) 
....

と言った書き方をすると、3.11からはMyInfoのコンストラクタが実行時エラーになる。
こう書かないといけない。
@dataclass
class MyInfo:
    name: Item = field(default_factory=Item('',0,'')) 
    parent: Item = field(default_factory=Item('',0,'')) 

fieldやdefault_factoryが何なのかは…知らん。
ちなみにこれ、その後、MyInfoのオブジェクトに対して.name=0 とかは平気で代入できる…ダメじゃん。
静的型システムも未導入の癖に、場当たり的(?)にチェックを強化するのは如何なものか。

入門 Python 3 第2版
Bill Lubanovic
オライリージャパン
2021-03-22

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

Twitterも先行き不透明ともっぱら評判なのでBotを増やす先を検討。
Threadsは公開APIもないしブラウザからアクセスも出来ないしInstagramアカウント必須で無理だから、後は色物でWeibo(https://m.weibo.cn/)か、TruthSocial(https://truthsocial.com/)か。ちなみにPawooとMisskeyはもうある。
Weiboはアカウント作成に携帯電話番号の登録が必要ということなので、今回はTruthSocialで行く( https://truthsocial.com/@nekora2199 )。
TruthSocialはMastodonの派生らしいので、何となく同じくアクセストークンを取得すれば全く同じAPIで使えるような気がするけれど、まぁまずは既存ので試そうと思ったらJavaライブラリが見当たらぬ…。
とりあえずPythonのを動かしてみるか… https://github.com/mcurranseijo/TruthWrapper そういえばAPI登録もシークレットキーの取得も無いんだけどどうなっておるのかな?サンプルだとユーザ名とパスワードでポスト出来るっぽいが…。
Splyderから起動すると
RuntimeError: asyncio.run() cannot be called from a running event loop
と言ってダメなのでコマンドラインから実行すべし。
  File "TruthWrapper-main\main.py", line 9, in main
    post = await user.post("Hello World!, This is a test post from TruthPy")
  File "TruthWrapper-main\TruthPy\user.py", line 29, in post
    response = await request_json(
  File "TruthWrapper-main\TruthPy\utils.py", line 11, in request_json
    data['next'] = response.headers['Link'].split(',')[1].split(';')[0].replace('<', '').replace('>', '')[1:]
KeyError: 'Link'
…駄目やんけ。何かの戻り値の文字列処理で失敗しているだけっぽいから見れば直せるような気もするが今日はこれまで。
→ちょっと調査したら403が返ってきているのに200で何かデータが返ってきている前提でパースしてるから失敗している。
つかそもそもクライアントIDとシークレット、このソースに直書きされているものをそのまま使って良いものだろうか…。TwitterやMastodonやMisskeyの時はクライアントIDとシークレットは各自のを使っていたけど。
ちなみにAPIのURLはhttps://truthsocial.com/api/v1/のようだ。んむ、MastodonっぽいURL。

https://www.reddit.com/r/TRUTHsocialWatch/comments/v29065/has_anyone_had_luck_accessing_the_truth_social_api/
「The endpoints seem to be geo-restriced. If you're outside the US/Canada/UK/Portugal you'll need a VPN.」というのも気になるな…北米リージョンにVM立てて試すか。


それにしてもやはり外聞が悪いのかTruth Social関連の技術ブログは余り見かけないな。



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

↑このページのトップヘ