Sudachiの形態素解析の品詞詳細メモ

そうだ、正規化しよう。

なお、この記事は自然言語処理の専門家でもなければ日本語の専門家でもない存在が書いています。大量に間違いがあるかもしれませんのでもしあなたがこの記事を参考にしようと思った際は気をつけてください。主に未来の私。

サンプルデータを雑にSudachiで形態素解析して得られた認識の一覧をメモしておく。
なお、サンプルデータは271108のTwitterテキストデータで、17978種類の単語からなっている文の集まり。

for y in tokenizer_obj.tokenize(x, tokenizer.Tokenizer.SplitMode.C)
     y.part_of_speech()

形態素解析を行うと、上記のy.part_of_speech()で品詞とかなんやらが得られる。
動詞,一般,*,*,五段-ワア行,終止形-一般
↑のような形をしている、品詞とかなんやらをpospとこの記事では呼んでいる。

全部まとめた印象としては、

  • pospの0番目は「品詞名」
  • pospの1番目は「区分1」
  • pospの2番目は「区分2」
  • pospの3番目は「区分3」
  • pospの4番目は「活用の種類」
  • pospの5番目は「活用形」

が入っているという認識をしている。

活用する品詞

国語のお時間です。

  • 動詞・助動詞・形容詞・接尾辞の一部の4つが活用する

形容動詞は……?

形容詞

  • pospの0番目は「形容詞」
  • pospの1番目は「一般」と「非自立可能」に分かれていた。
  • pospの2番目は「*」が入っていた。
  • pospの3番目は「*」が入っていた。
  • pospの4番目は活用の種類が入っていた。活用の種類として「形容詞」「文語形容詞-ク」「文語形容詞-シク」が入っていた。他にあるかは不明。
  • pospの5番目は動詞や助動詞と同じような活用形が入っていた。

助動詞

  • pospの0番目は「助動詞」
  • pospの1番目は「*」が入っていた。
  • pospの2番目は「*」が入っていた。
  • pospの3番目は「*」が入っていた。
  • pospの4番目は「下一段-タ行」「五段-ワア行」「助動詞-タ」「文語下二段-ラ行」「文語助動詞-ズ」のような活用の種類が入っていた。
  • pospの5番目は「未然形-一般」「命令形」「仮定形-融合」「意志推量形」「已然形-一般」「語幹-一般」のような活用形が入っていた。

接尾辞

  • pospの0番目は「接尾辞」
  • pospの1番目は「名詞的」「形状詞的」「形容詞的」「動詞的」に分かれていた。
形容詞的接尾辞・動詞的接尾辞
  • pospの2番目は「*」が入っていた。
  • pospの3番目は「*」が入っていた。
  • pospの4番目は活用の種類が入っていた。活用の種類として「形容詞」「下一段-ナ行」「五段-マ行」「五段-ラ行」「上一段-マ行」が入っていた。他にあるかは不明。
  • なお、確認した限りでは形容詞的接尾辞の活用の種類は「形容詞」、動詞的接尾辞の活用の種類は「下一段-ナ行」「五段-マ行」「五段-ラ行」「上一段-マ行」になっていた。
  • pospの5番目は動詞や助動詞と同じような活用形が入っていた。「意志推量形」は見当たってないが……

動詞

  • pospの0番目は「動詞」
  • posp1番目は2つに分かれていたっぽい。動詞は「一般」と「非自立可能」に分かれているらしい。
  • 「非自立可能」な動詞は「終わる」「ある」「なる」「やる」「くださる」とかそういったものらしい。
  • pospの2番目は「*」が入っていた。
  • pospの3番目は「*」が入っていた。
  • pospの4番目は「下一段-ア行」のような活用の種類が入っていた。
  • pospの5番目は「連用形-一般」「終止形-撥音便」「仮定形-融合」「意志推量形」のような活用形が入っていた。

活用しない(もしくは活用が確認されなかった)品詞

なお、今回形態素解析を行った際に空白が入っていない文章を使っているため、もしかしたらpospの0番目が「空白」となっている品詞があるかもしれない。

BOS/EOS

これは私が設定した気がする。

  • pospの0番目は「BOS/EOS」
  • pospの1番目は「BOS」または「EOS」が入っている。
  • pospの2番目は「*」が入っている。
  • pospの3番目は「*」が入っている。
  • pospの4番目は「*」が入っている。
  • pospの5番目は「*」が入っている。

感動詞

  • pospの0番目は「感動詞
  • pospの1番目は「一般」または「フィラー」が入っていた。
  • pospの2番目は「*」が入っていた。
  • pospの3番目は「*」が入っていた。
  • pospの4番目は「*」が入っていた。
  • pospの5番目は「*」が入っていた。

記号

  • pospの0番目は「記号」
  • pospの1番目は「一般」または「文字」が入っていた。
  • pospの2番目は「*」が入っていた。
  • pospの3番目は「*」が入っていた。
  • pospの4番目は「*」が入っていた。
  • pospの5番目は「*」が入っていた。
posp[1]:一般 の例
  • 「っ」
  • 「ゃ」
  • 「O」*1
  • 「ヴ」*2
  • 「ゅ」*3
  • 「ゆ」*4

何をもって一般としているのかは分からなかった。

posp[1]:文字 の例
  • 「¥」
  • 「Ω」*5
  • 「Τ」*6
  • 「オメガ」
  • 「しゅ」*7

何をもって文字としているかは分からなかった。

形状詞

  • pospの0番目は「形状詞」
  • pospの1番目は「一般」「タリ」「助動詞語幹」が入っていた。
  • pospの2番目は「*」が入っていた。
  • pospの3番目は「*」が入っていた。
  • pospの4番目は「*」が入っていた。
  • pospの5番目は「*」が入っていた。

特に「タリ」に区分されているものは形容動詞に似ているようなそうでもないような……

助詞

  • pospの0番目は「助詞」
  • pospの1番目は「格助詞」「係助詞」「終助詞」「準体助詞」「接続助詞」「副助詞」が入っていた。
  • pospの2番目は「*」が入っていた。
  • pospの3番目は「*」が入っていた。
  • pospの4番目は「*」が入っていた。
  • pospの5番目は「*」が入っていた。

接続詞

  • pospの0番目は「接続詞」
  • pospの1番目は「*」が入っていた。
  • pospの2番目は「*」が入っていた。
  • pospの3番目は「*」が入っていた。
  • pospの4番目は「*」が入っていた。
  • pospの5番目は「*」が入っていた。

接頭辞

  • pospの0番目は「接頭辞」
  • pospの1番目は「*」が入っていた。
  • pospの2番目は「*」が入っていた。
  • pospの3番目は「*」が入っていた。
  • pospの4番目は「*」が入っていた。
  • pospの5番目は「*」が入っていた。

接尾辞

  • pospの0番目は「接尾辞」
  • pospの1番目は「名詞的」「形状詞的」「形容詞的」「動詞的」に分かれていた。
名詞的接尾辞
  • pospの2番目は「一般」「副詞可能」「助数詞」「サ変可能」が入っていた。
  • pospの3番目は「*」が入っていた。
  • pospの4番目は「*」が入っていた。
  • pospの5番目は「*」が入っていた。
形状詞的接尾辞
  • pospの2番目は「*」が入っていた。
  • pospの3番目は「*」が入っていた。
  • pospの4番目は「*」が入っていた。
  • pospの5番目は「*」が入っていた。

代名詞

  • pospの0番目は「代名詞」
  • pospの1番目は「*」が入っていた。
  • pospの2番目は「*」が入っていた。
  • pospの3番目は「*」が入っていた。
  • pospの4番目は「*」が入っていた。
  • pospの5番目は「*」が入っていた。

副詞

  • pospの0番目は「副詞」
  • pospの1番目は「*」が入っていた。
  • pospの2番目は「*」が入っていた。
  • pospの3番目は「*」が入っていた。
  • pospの4番目は「*」が入っていた。
  • pospの5番目は「*」が入っていた。

補助記号

  • pospの0番目は「補助記号」
  • pospの1番目は「一般」「読点」「句点」「括弧開」「括弧閉」「AA」が入っていた。*8
  • 「AA」以外ではpospの2番目は「*」が入っていた。
  • pospの3番目は「*」が入っていた。
  • pospの4番目は「*」が入っていた。
  • pospの5番目は「*」が入っていた。
AA
  • 「AA」ではpopsの2番目は「顔文字」または「一般」が入っていた。

AAに含まれていた単語は以下のもの。

  • 「^^」:顔文字
  • (´・ω・`)」:顔文字
  • 「^^」:顔文字
  • 「(´・ω・`)」:顔文字
  • 「^q^」:顔文字
  • 「orz」:一般*9

名詞

  • pospの0番目は「名詞」
  • pospの1番目は「固有名詞」「助動詞語幹」「数詞」「普通名詞」が入っていた。
固有名詞
  • pospの2番目は「一般」「人名」「地名」が入っていた。
  • 「人名」の場合、pospの3番目は「一般」「姓」「名」が入っていた。
  • 「地名の場合、」pospの3番目は「一般」「国」が入っていた。*10
  • pospの4番目は「*」が入っていた。
  • pospの5番目は「*」が入っていた。
助動詞語幹・数詞
  • pospの2番目は「*」が入っていた。
  • pospの3番目は「*」が入っていた。
  • pospの4番目は「*」が入っていた。
  • pospの5番目は「*」が入っていた。

連体詞

  • pospの0番目は「連体詞」
  • pospの1番目は「*」が入っていた。
  • pospの2番目は「*」が入っていた。
  • pospの3番目は「*」が入っていた。
  • pospの4番目は「*」が入っていた。
  • pospの5番目は「*」が入っていた。

*1:おそらく「O-01-04」のような文字列を分解して生じたものと思われる。

*2:これは固有名詞の可能性がある。

*3:おそらくこれは固有名詞の間違い。271108にこう呼ばれている人物がいる。

*4:おそらくこれは固有名詞の間違い。271108にこう呼ばれている人物がいる。余談だがゅと同一人物。

*5:ギリシャ文字全般がこうなっていた

*6:分かりにくいがこれはタウ。Tではない。

*7:原文であるかは分からないが、これを含む文章を生成させたところ、「しゅがーまーがりんとか恐ろしそうなワードが見えた」と出力された。おそらく「シュガーマーガリン」をひらがなで書いたことの弊害。正規化、しよう!

*8:なお、今回のデータでは括弧開と括弧閉の数が釣り合っていない。「’」と「>」に対応する括弧開がなかった。なんとなく括弧としてこれらの記号を使っていない気がする。

*9:まぁ確かに顔文字ではないわな。

*10:「NZ」をニュージーランドであると認識しているのか、国として分類していた。

進捗確認:20220704

271108.hatenablog.com
↑これの進捗確認と優先度確認です。

前提

沢山の文(と言うかツイート)をなんやかんやして集める、と言うか集めてる。別にAmesiorineさんのお仕事は1時間に1回トンチキなことをツイートするためだけじゃあないんですよ。

変更点はなし。

271108の知識関係なく考えること

対話システム、乃至発言システムというのはどうにも常識外れのことを発言してしまうものです。そのため、Amesiorineにはある程度賢そうに見えない設定が必要になるでしょう。天才そうに見えているのにすっとぼけたことを言うとがっかりしますからね。アホの子がアホなことを言っても「かわいいね」で済みますが、スーツ着た偉そうな人があほなことを言うと叩かれるようなものです。(本当?)
そのため、幼めの設定が必要になるはず。
あとは271108の趣味でいいでしょう。設定資料作ったら誰かに絵とか頼むか?

進捗ダメです。真面目にやれ。

バグ修正

多分今エミィなんも食べてない。
・DailySwallow()
・CanAmyEatThisTextList(d)
・swallow(c)
多分この辺にミスがあるっぽいので確認。
↑対応済

バグ修正できてえらい。

アップデート:BeTSCAE

  1. 作った文章を全部記録したほうがいいかも。
  2. テキスト生成の評価指標があったはず。これで作った文章の評価していいかも。
  3. 生成した文章の単語を置き換え*1てもいいんじゃないかな。単語スワップLSIとかで複数パターンできたりしない?

どれもやっていません。カス。

特定の単語から文章生成を開始することってできない?

案1
  1. 特定単語から開始
  2. 後ろへ展開していってEOSで終わり。
  3. 今度は特定単語から前へ展開していってBOSで終わり。
  4. できたものを出力

↑これだと、つなぎ目の部分が崩壊するかもしれない

案2
  1. 特定単語を真ん中に持つMDを持ってくる
  2. そのMDから案1と同じように展開して出力

案2で実装しました。えらい。まだエミィに組み込んでいません。
理由は「ありきたりでない単語を選ばなくてはいけないが、ありきたりでない単語の区別ができていないため」です。さっさと実装しろ私。

単語スワップ:BeTSCAE内

単語スワップ構想案
  1. 該当単語達がw2vにあるか確認する
  2. 単語の稀少度(IDFとか?)を算出?
  3. 1番稀少な単語を入れ替える
  4. 2番目に稀少な単語*2をw2vとかの足し算引き算してそれっぽく置き換える。

2の補足:IDFを使ってその文章の中で希少単語がどれかを調べる。(順位付をする?)

単語スワップ:BeTSCAE大幅改築

  1. マスク単語推定(正しくは何て言うんだっけ?BERTとかRoBERTとかT5みたいなのでできるやつ)をして文を書き換えるのができるかも。
  2. これと単語スワップでデータのカサ増しができるかも?
  3. カサ増ししたものも、目視だけじゃなくて、テキスト生成の評価指標あったはず、それかなんかである程度判定できないかな

ここまで読み返した私なら分かってると思うけど実装されているわけがありません。

未検討

  1. 格フレームってものがあったはず。用言とそれに関係する名詞とか助詞とかなんかだったような。
  2. MAUVE?

やってるわけないじゃん。

対話システム

まだそもそもデータを集めていない。

  1. 271108とエミィのリプライだけでもいいしそれ以外も集めてもいいかも。もっとも、遠くの人のデータまで集めに行くのはめんどい。

同じようなデータを集めないといろいろ面倒かもしれない。

やってるわけないじゃん。

データ整備

  1. DBDC対話破綻検出。対話が破綻しているかどうかのモデルを作るならこの辺?

やってるわけないじょん。
ところでこういう人間なら例えばボイロ動画のコメントとかで「○○じょん」ってなってると「○○じゃん」って意味だよなぁって分かるけどこれって機械はどうやるんだろう。これ大学とか研究所案件か?

追加の思い付き

GPT-2

前回の思い付きメモにはなかったこと。
GPT-2使って文章生成するとかエミィに食べさせる文章増やすとかできない?って思ってGPT-2に触れてみた。ある程度の汎用性のある私のツイートデータでファインチューニングを行ったものの、「『140字以内で文章を止める』の設定を行わなかった」か「そもそも140字以内だけの文章という思想が間違っている」のどちらかの要因により期待したようなものはできなかった。期待してたレベルも低かっただけにそれ以下か……という思いはあるけどまあしょうがないね。

ツイート要約

これはまだ完全に思いつき。
文字通りバラバラのツイートを集めて文章にした場合って要約できるのかな……?

BeTSCAE追加

出現回数について、いい加減考えませんか?思ったよりBeTSCAEも重くなさそうだし。

メモ

https://twitter.com/271108_/status/1547282555699081216?s=20&t=62-jJTm0iWdezxPdmYfokg
271108.hatenablog.com


https://twitter.com/271108_/status/1547331502962507776?s=20&t=ee9JCAGFQUPTbJm
先に後ろの「語」との活用が一致するかの確認がいるはず。typo


↑エミィのキャラ設定決められないんなら自動で生成して選ばんか?



その他

zenn.dev

twitter.com

*1:以降、「単語スワップ」と呼ぶ

*2:ただし、1番稀少な単語とは別単語

記憶:Tactron2+WaveGlowによる音声合成(1)

そもそもこの記事について

以下の書籍の6-1の音声合成に挑戦したときの記憶です。
www.borndigital.co.jp
2022/5/20より長いことやったりやらなかったりしているため、記憶が薄れつつある箇所もございます。

なお、あくまでも私の環境で発生したことしか記憶していないのでご容赦ください。

また、この「そもそもこの記事について」は271108.hatenablog.comとほぼ同じものですが、対象の章が違うものになっています。

そもそも

Tacotron2とWaveGlowを用いて行っている。
Tacotron2に関してはTactron2とかで検索するのが早いはず。この記事を書いている時点での私では、「音声合成でよく使われているNVIDIAフレームワーク」程度の認識。
なお、WaveGlowに関しては名前を聞いたことがある程度でよく分かっていない*1

でもって、何をやっているかというと、The LJ Speech Datasetで事前学習したモデルをJSUTで転移学習させて日本語の音声合成作るよ!ってことをやる。

苦戦点

pyopenjtalkのインストール

詳しくは過去の記事
271108.hatenablog.com

apexのインストール

271108.hatenablog.com
これ、この記事を書いているときに公開していないことを発見したんだけど、どうやってapexをインストールしたのかよく覚えていない。
なお、GoogleColabで学習させたときには何にも問題なかったことは覚えているのでそっちで学習させて満足したか。

Tensorboard開きたいけど403エラーが出る。

これはGoogleColabの話。
stackoverflow.com
これで解決できる。

TensorBoard「No dashboards are active for the current data set. 」

どうして。
これは、logファイルが見つからなかったときに出るやつ(のはず)。なぜか出たことがあった。

記憶

学習関連

hparams.pyは参考元に則りepochs=100に変更。変更前は500だったか。
train.pyで学習させた。学習時間は覚えていないが、参考元は4000なのに対しなぜか5000*2ステップ学習した。なんで?

loss

大丈夫かこれ。まあ5100くらいまでは減ってると言い張れそうだったので5000で実行した。

成果物確認関連

06テキストを音素に変換とあったが、テキストを入力してそれを音声に変換したかった。
そのため、pyopenjtalkを用いて音素に変換し、それを入力した。
その際、スペースの除去、ポーズを示す"pau"を","に置換、文末に"."の追加が必要だった。

音声ファイル未アップロード
あとでTwitterにあげとこう




次やるなら……

学習データの均等化

同じJSUTを使って学習させるだけでも、transcripをうまく設定させればもう少しだけ良くなるかもしれない。basicから4000文、utparaphraseから410文、……といった感じに均等に学習データ・バリデーションデータと分けてみるのもよさそう。

epochs=500

500に戻して学習させてみようか

*1:まあこの書籍に書いてあったのでそれを読んで雰囲気を知った感じ。P225-Tactron2+WaveGlowとは で書かれていることを覚えているくらい?

*2:正確にはgoogleColabに止められる5280程度

Apexのインストール?

別にどこぞのFPSの話ではないです。

R0:vsCUDA

まずはCUDAのインストールから。

今回

インストール

今回はtensorflowのversionは1.xなので、CUDAは1.10。
うん。前回の失敗の記憶が生きてるネ!記事に残しておいてよかったヨ!
じゃ、バージョンの確認を。

nvcc -v
nvcc fatal   : No input files specified; use option --help for more information

んえ?と思いましたが

nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2018 NVIDIA Corporation
Built on Sat_Aug_25_21:08:04_Central_Daylight_Time_2018
Cuda compilation tools, release 10.0, V10.0.130

大文字と小文字の区別がついていないだけでした。

PyTorch

別にCUDA入れてはいおしまいではないです。
PyTorch1.7.1も必要です。
pytorchってどうやって入れるんだっけ????とか思いましたが過去に優秀な人が記事を残してくれています。
271108.hatenablog.com
入れたっけ???

と思ったけどコマンドを打ち込むだけだった。

R1

普通は

git clone https://github.com/NVIDIA/apex

して、

pip install -v --disable-pip-version-check --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./

すればいいはず。

RuntimeError

 RuntimeError: Cuda extensions are being compiled with a version of Cuda that does not match the version used to compile Pytorch binaries.  Pytorch binaries were compiled with Cuda 11.0.

RuntimeError:Cuda拡張機能は、Pytorchバイナリのコンパイルに使用されたバージョンと一致しないバージョンのCudaでコンパイルされています。 PytorchバイナリはCuda11.0でコンパイルされました。
うん?Cudaのバージョンを変えなきゃいけないの?と思ったけど、そうでもないみたい。

cudaと互換性のあるpytorchのバージョンを確認しろ

これは10.0。

CUDAバージョンが10.0の場合は、cudaを使用してpytorchを再確認してください
https://pytorch.org/get-started/previous-versions/

pip install torch==1.2.0 torchvision==0.4.0

これかな?

ERROR: Could not find a version that satisfies the requirement torch==1.2.0 (from versions: 1.7.0, 1.7.1, 1.8.0, 1.8.1, 1.9.0, 1.9.1, 1.10.0, 1.10.1, 1.10.2, 1.11.0)
ERROR: No matching distribution found for torch==1.2.0

違うみたい。

参考になりそうな気がする。

https://github.com/NVIDIA/apex/issues/723

オチ

参考資料はCUDA11.0を使っていた。pytorchは1.7.1。

R2

気を取り直してもう一度。

アンインストール

CUDAのアンインストールはコントロールパネルから行うらしい。

11.0のインストール

これtensorflow動くのかなぁとか疑問に思いながらではあるけどまあ参考資料あるしその時考えましょう。考えてもわからないことはやってから考える。

それでも同じエラー

ここで記録途切れてるんだけどどうやってインストールしたの

最終的な環境確認

pytorch:1.7.1
CUDA:11.0

記憶:HuggingfaceTransformers

そもそもこの記事について

以下の書籍の4-6の文章生成に挑戦したときの記憶です。
www.borndigital.co.jp
2022/5/20より長いことやったりやらなかったりしているため、記憶が薄れつつある箇所もございます。

なお、あくまでも私の環境で発生したことしか記憶していないのでご容赦ください。

そもそも

サンプルコード

そもそも先のリンクから、サンプルコード?が配布されていた。基本的にはそれに則って実行すればうまくいくんじゃないかなって思った。案外そんなことはなかった。

実行環境

なお、実行環境はpython3.7、jupyter環境とgoogle colabの2つで行った。これはjupyterでできなかったからcolabでやればできるかもしれないかなぁって思ったからだが、多分関係ないんじゃないかな……。
また、ファインチューニングの実行の際には「あかねと~く」の会話データではなく、私のTwitterのツイートデータを用いて実行した。

本題:生じた問題の記憶

from transformers import T5Tokenizer, AutoModelForCausalLMのインポートができない

処置
!pip install transformers[ja]==4.4.2

でインストールした。なお、ファインチューニングの実行の時にrun_clm.pyで実行するので

!git clone

は実行した。

AttributeError: module 'dill._dill' has no attribute 'stack'

起きた状況

ファインチューニングの実行時

処置

どうやらdatasets\utils\py_utils.pyで起きているらしい。

  1. dillのアップデートを確認したが最新バージョンで実行していた。
  2. 書籍では!pip install datasets==1.2.1の指定をしていたが、これを無視。

結局datasetsのバージョンはVersion: 2.3.2で実行

なお

dillはpickleに近そうなものらしい。↓参考
mojitoba.com

本題ではないが気になったこと

誤植?

正直、私が気付くような所なんて「見りゃあ分かンだろんなもん」な場所だが、この本を読み返す時の私がそこまで賢いとは思わないんだ。

ファインチューニングの実行準備

作業フォルダ(workフォルダ)の直下に学習データ「train.csv」と検証データ「dev.csv」を配置します。

となっていたが、多分それぞれ拡張子が間違っていて「train.txt」と「dev.txt」のはず。まあそう読み替えて実行した。

ファインチューニングの実行
!python ./transformers/examples/language-modeling/run_clm.py \
    --model_name_or_path=rinna/japanese-gpt2-medium \
    --do_train \
    --do_eval \
    --train_file=train.txt \
    --validation_file=train.txt \
    --num_train_epochs=100 \
    --save_steps=5000 \
    --save_total_limit=3 \
    --per_device_train_batch_size=1 \
    --per_device_eval_batch_size=1 \
    --output_dir=output/ \
    --use_fast_tokenizer=False \
    --logging_steps=50

となっているが、訓練データとバリデーションデータが同じファイルを指定していた。多分dev.txtのミスだと思い書き換えて実行した。

メモ書き:tweet.js

そんな気分になったので書いてます。
必要に応じて書き足します。

そもそも

そもそもjsonとして読み込むには序盤のいらない部分を切り落とすとかなんかしらの処理をしないといけない

import re
import datetime
import json
tw_open = open("tweets.js","r",encoding="utf-8")
twr = tw_open.read()
twr = re.sub("window.YTD.tweet.part0 = ","",twr)
twrj=json.loads(twr)

構造

これブログだと表記できない?

'tweet'
	'retweeted',
	 'source', 
	 'entities',
		'hashtags',
			※該当があれば
			'text'
			'indices'
		 'symbols',
		 'media',※該当があれば
			"expanded_url"
			"source_status_id"
			'indices'
			'url'
			'media_url'
			'id_str'
			'source_user_id'
			'id'
			'media_url_https'
			'source_usre_id_str'
			'sizes'
				'thumb'
					'w'
					'h'
					'resize'
				'large'
					'w'
					'h'
					'resize'
				'small'
					'w'
					'h'
					'resize'
				'mediun'
					'w'
					'h'
					'resize'
				'type'
				'source_status_id_str'
				'display_url'
		 'user_mentions',
		 'urls'
	 'display_text_range',
	 'favorite_count',
	 'id_str',
	 'truncated',
	 'retweet_count',
	 'id',
	 'created_at',
	 'favorited',
	 'full_text',
	 'lang'
	 'extended_entities'
		'media'
			'expanded_url'
			'source_status_id'
			ほか

要素詳細

source

何を使ってツイートしたか。例: "Twitter for iPhone"

user_mentions

リプライ先。リストみたいな形式。配列っていうべき?知らないや。
なお、リツイートした場合、ここに元ツイート主のIDが入っている。詳細はfull_textにて。

created_at

おそらくツイートされたタイミング。
RTの場合はRTをしたタイミング。

tw=eval(str(twrj[n]["tweet"]))
datetime.datetime.strptime(str(tw["created_at"]),"%a %b %d %H:%M:%S %z %Y").replace(tzinfo=None)

とかで引っ張り出せば使いやすいかも。知らんけど。

truncated

基本的にfalseなので気にしなくていいって聞いた。字数制限を突破してツイートされたときに発生するらしい。するんか?

full_text

ツイートのテキストが入っている。
なお、リツイートした場合は、
「"full_text" : "RT @colopl_quiz: ガトリンの公約を発表します(/・ω・)/\nガトリンが1位になったら、人類総ナース!ということで6人全員がナースになります!\n詳細はコチラ:https://t.co/nLZeat3PKx\n#黒ウィズ #アイドルキャッツ https://t.co/…",」
的な感じで、最初に「RT @[オリジナルツイートのアカウント(screen_name)]: 」がつく。
リプライの場合は、@[リプライ先ののアカウント(screen_name)] 」がつくと思われる

メモ書き:jsonを開いたり開かなかったり

開きたくなる季節です。海でも山でもjsonでも。
というわけでメモ書き。

json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

開くやつがjson形式ではないことによるもの。記憶があいまいだけど、上のエラーもそうなんじゃないかなって思う。知らんけど。

import requests
r = requests.get(url)
if 'json' in r.headers.get('content-type'):
    result = r.json()
    print(result)
else:
    result = r.text
    print(result)

とかして、json形式じゃないとき別の処理するようにしたらなんとかなるかも。ならないかも。

在りし日のうまくいかなかった記憶

文字コード

import json
with open('285513.js', 'r') as json_open:
    json_load = json.load(json_open)
UnicodeDecodeError: 'cp932' codec can't decode byte 0x84 in position 757: illegal multibyte sequence

いつもの。
encoding="utf-8"で指定すればいいかな。

** JSONDecodeError

import json
with open('285513.js', 'r',encoding="utf-8") as json_open:
    json_load = json.load(json_open)

jsonデータではない空の行が含まれているかも?

余談

別の解決法を見つけたので結局これでは開いてないです