えらい人はなぜ偉そうなのか

労働者階級ではないから
こちら(プロレタリアート)は権力勾配(パワー)により生まれる生存本能で保険をかけてしまい何も動けなくなる
えらい人(ブルジョワジー)も孤独でプレッシャーがあり、鎧を纏っている結果として偉そうにみえる
人類の99%はこの先10年で無用階級(ダリッド級)になり、AI貴族によって管理されるので一過性なのかもしれない

資産メモ

  • iDeCo割合を海外アクティブファンド100%にしていたが、インデックスファンド(日本50%、全世界50%)に変更
    • 選ばれし人類の選定によるアクティブファンドの手数料の割に、インデックスファンドに利益率負けてきたため
    • 人類の敗北
    • 年金いらないからiDeCoに月50万払わせてほしい

直近やりたいこと

  • Gemini AdvancedのGemsでいい感じのプロンプト研究
  • pandas研究
  • React Nativeでアプリ作り
  • 技術要素を整理する方法について模索(いちいち図にするのめんどい、いい感じのプレゼン資料からコピペできるやつほしい、Google Mapみたいに拡大縮小したい)
  • 情報処理試験勉強

資格部とかいう神サイトで午後問題も過去問やりやすい

qe.hpeo.jp

Sudachiを使って形態素解析(名詞抽出)

spacy+GiNZAだと100秒かかったのがsudachiだと10秒で終わる、しかも名詞自動抽出の精度もなかなか。

#!wget https://www.rondhuit.com/download/ldcc-20140209.tar.gz
#!tar -zxvf ldcc-20140209.tar.gz
#!pip install sudachipy sudachidict_core

# 大量データセットの用意
import pandas as pd
import glob

# データを読み込むディレクトリを指定
data_dir = "text/"

# カテゴリとファイルパスのリストを作成
categories = [name for name in glob.glob(data_dir + "/*")]
file_paths = [name for category in categories for name in glob.glob(category + "/*")]

# データを読み込んでDataFrameを作成
data = []
for path in file_paths:
  with open(path, "r") as f:
    text = f.read()
  category = path.split("/")[-2]
  data.append({"category": category, "text": text})

df = pd.DataFrame(data)

from sudachipy import tokenizer
from sudachipy import dictionary

tokenizer_obj = dictionary.Dictionary().create()
mode = tokenizer.Tokenizer.SplitMode.C  # 分割モードをCモードに設定

def nonus_tokenize(text):
  lines = text.split('\n')[2:]
  text = '\n'.join(lines)
  nouns = [m.surface() for m in tokenizer_obj.tokenize(text, mode) if m.part_of_speech()[0] == "名詞"]
  return nouns

import time
print(df.count())
start = time.time()
df["tokens"] = df["text"].apply(nonus_tokenize)
end = time.time()
time_diff = end - start
print(time_diff)
print(df["text"][0])
print(df["tokens"][0])

pandas多量データに対して人名抽出

速度を計測

なぜかnlp.pipeの効果があまりなかった・・・

  • nlp.pipeは結構メモリを消費するので使用する際は注意
  • 人名抽出だけならnlpの enable=['tagger'] オプションで高速化できる

■enable=['tagger']あり

nlpの並列化 nlp.pipeのbatch数 秒数(約7500データ)
nlp.pipe batch=1000 102.87
nlp.pipe batch=2000 100.61
nlp.pipe batch=5000 105.46
nlp.pipe なし 106.12
なし(df.apply) - 101.83

■enable=['tagger']なし

nlpの並列化 nlp.pipeのbatch数 秒数(約7500データ)
nlp.pipe batch=1000 numpy.core.exceptions.ArrayMemoryError: Unable to allocate 2.03 GiB for an array with shape (946264, 576) and data type float32
nlp.pipe batch=2000 numpy.core.exceptions.ArrayMemoryError: Unable to allocate 2.97 GiB for an array with shape (1659733, 480) and data type float32
nlp.pipe batch=5000 numpy.core.exceptions.ArrayMemoryError: Unable to allocate 1.43 GiB for an array with shape (3993494, 96) and data type float32
nlp.pipe なし numpy.core.exceptions.ArrayMemoryError: Unable to allocate 86.0 MiB for an array with shape (234708, 96) and data type int32
なし(df.apply) - 574.53
# pip install setuptools
# pip install ipadic

import pandas as pd
import glob

# データを読み込むディレクトリを指定
data_dir = "text/"

# カテゴリとファイルパスのリストを作成
categories = [name for name in glob.glob(data_dir + "/*")]
file_paths = [name for category in categories for name in glob.glob(category + "/*")]

# データを読み込んでDataFrameを作成
data = []
for path in file_paths:
  with open(path, mode="r", encoding="utf-8") as f:
    text = f.read()
  # category = path.split("/")[-2]
  data.append({"text": text})

df = pd.DataFrame(data)

import spacy

import time

nlp = spacy.load("ja_core_news_lg", enable=['tagger'])

def remove_personal_name_with_spacy(row):
    text = row.text
    #start = time.time()
    doc = nlp(text)
    result = []
    for token in doc:
      if token.tag_ in ["名詞-固有名詞-人名-姓", "名詞-固有名詞-人名-名"]: 
        result.append("●●")
      else:
        result.append(token.text)
    #end = time.time()
    #time_diff = end - start
    #print(time_diff)
    return "".join(result)

def remove_personal_name_with_spacy_pipe(doc):
    result = []
    for token in doc:
      if token.tag_ in ["名詞-固有名詞-人名-姓", "名詞-固有名詞-人名-名"]: 
        result.append("●●")
      else:
        result.append(token.text)
    return "".join(result)

print(len(df["text"]))

start = time.time()
#df["tokens"] = [remove_personal_name_with_spacy_pipe(doc) for doc in nlp.pipe(iter(df['text']), batch_size = 2000)]
df["tokens"] = df.apply(remove_personal_name_with_spacy, axis=1)
end = time.time()
time_diff = end - start
print(time_diff)

print(df.count())
print(df["text"][0])
print(df["tokens"][0])

MeCabで名詞抽出

vibratoがビルドできない場合はMeCabそのまま使ったほうが手軽

#!pip install mecab-python3
#!pip install setuptools
#!pip install ipadic

# 大量データセットの用意は前回記事参照

import pandas as pd
import glob

# データを読み込むディレクトリを指定
data_dir = "text/"

# カテゴリとファイルパスのリストを作成
categories = [name for name in glob.glob(data_dir + "/*")]
file_paths = [name for category in categories for name in glob.glob(category + "/*")]

# データを読み込んでDataFrameを作成
data = []
for path in file_paths:
  with open(path, mode="r", encoding="utf-8") as f:
    text = f.read()
  # category = path.split("/")[-2]
  data.append({"text": text})

df = pd.DataFrame(data)

import MeCab
import ipadic
CHASEN_ARGS = r' -F "%m\t%f[7]\t%f[6]\t%F-[0,1,2,3]\t%f[4]\t%f[5]\n"'
CHASEN_ARGS += r' -U "%m\t%m\t%m\t%F-[0,1,2,3]\t\t\n"'
tagger = MeCab.Tagger(ipadic.MECAB_ARGS + CHASEN_ARGS)

def nonus_tokenize(text):
  lines = text.split('\n')[2:]
  text = '\n'.join(lines)
  node = tagger.parseToNode(text)
  nons = []
  while node:
    word = node.surface
    hinshi = node.feature.split(",")[0]
    if hinshi == "名詞":
      nons.append(word)
    node = node.next
  return nons

df["tokens"] = df["text"].apply(nonus_tokenize)

print(df.count())
print(df["text"][0])
print(df["tokens"][0])

大量日本語データセットを用意してvibratoで形態素解析するサンプル

大量日本語データセット準備(ライブドアニュース)

#!wget https://www.rondhuit.com/download/ldcc-20140209.tar.gz
#!tar -zxvf ldcc-20140209.tar.gz
#!pip install pandas

import pandas as pd
import glob

# データを読み込むディレクトリを指定
data_dir = "text/"

# カテゴリとファイルパスのリストを作成
categories = [name for name in glob.glob(data_dir + "/*")]
file_paths = [name for category in categories for name in glob.glob(category + "/*")]

# データを読み込んでDataFrameを作成
data = []
for path in file_paths:
  with open(path, "r") as f:
    text = f.read()
  category = path.split("/")[-2]
  data.append({"category": category, "text": text})

df = pd.DataFrame(data)

vibrato準備

#!pip install vibrato
#!pip install zstandard
# 分類モデルのダウンロード
#!wget https://github.com/daac-tools/vibrato/releases/download/v0.5.0/ipadic-mecab-2_7_0.tar.xz
#!tar xf ipadic-mecab-2_7_0.tar.xz

import vibrato
import zstandard

# 分類モデルの読み込み
dctx = zstandard.ZstdDecompressor()
with open('ipadic-mecab-2_7_0/system.dic.zst', 'rb') as fp:
     with dctx.stream_reader(fp) as dict_reader:
        tokenizer = vibrato.Vibrato(dict_reader.read())

大量データセットに対して形態素解析して名詞を抽出(列を追加)

def nonus_tokenize(text):
  lines = text.split('\n')[2:]
  text = '\n'.join(lines)
  tokens = tokenizer.tokenize(text)
  nouns = [token.surface() for token in tokens if token.feature().split(',')[0] == "名詞"]
  return nouns

df["tokens"] = df["text"].apply(nonus_tokenize)

print(df.count())
print(df["text"][0])
print(df["tokens"][0])

結果

手元のPCでは7000件に対して5秒で実行できた。

category    7376
text        7376
tokens      7376
dtype: int64
http://news.livedoor.com/article/detail/6317546/
2012-02-27T16:11:00+0900
「最新」とつぶやくだけで最新ニュースをゲット! 定期配信も可能な便利機能が「LINE」に登場【話題】
スマートフォンアプリとして人気の「LINE」。チャットやIP電話を手軽に楽しむことができると人気だ。そのアプリから、今度はニュース情報をチェックすることができる「公式アカウント」が登場した。
これは、世の中の話題を幅広く扱っている「livedoorニュース」からの注目のニュースを教えてくれる「LINEニュース」アカウント。

使い方も簡単で公式アカウント「LINEニュース」(ID:linenews)を追加するだけ。朝、昼、晩と時間を指定することで、定期購読も簡単に行え、また「最新」と送るとその時点での最新ニュースも3つ教えてくれる。これによって、毎日のニュースのチェックも、知りたいときに最新情報を得ることもでき便利だ。

LINE内の「友達追加」一覧から「知り合いかも?」のところからも追加することができる公式アカウント。LINE利用者はチェックしてみてはいかがだろう?

LINE    

■関連記事
・ソニーF3 ズームレンズテスト【ビデオSALON】
・会議室から教室まで! 価格で汎用性の高い3D対応プロジェクターDELLから新発売【売れ筋チェック】
・ZACUTO社製 キヤノンC300用アクセサリーが発売【ビデオSALON】
・この時期に頼りになるのは空気清浄機! 豪徳寺美鈴が悩んでゲットしたのはコレ!【家電の女:第四話】
・AKB前田敦子がネタにされファンが大激怒! 日本一下世話なクイズ番組がネットで話題に【話題】

['最新', '最新', 'ニュース', 'ゲット', '定期', '配信', '可能', '便利', '機能', 'LINE', '登場', '話題', 'スマートフォンアプリ', '人気', 'LINE', 'チャット', 'IP', '電話', '手軽', 'こと', '人気', 'アプリ', '今度', 'ニュース', '情報', 'チェック', 'こと', '公式', 'アカウント', '登場', 'これ', '世の中', '話題',
 'livedoor', 'ニュース', '注目', 'ニュース', 'LINE', 'ニュース', 'アカウント', '使い方', '簡単', '公式', 'アカウント', 'LINE', 'ニュース', 'ID', 'linenews', '追加', '朝', '昼', '晩', '時間', '指定', 'こと', '定期', '購読', '簡単', '最新', '時点', '最新', 'ニュース', '3つ', 'これ', '毎日', 'ニュース', 'チ
ェック', 'とき', '最新', '情報', 'こと', '便利', 'LINE', '内', '友達', '追加', '一覧', '知り合い', 'ところ', '追加', 'こと', '公式', 'アカウント', 'LINE', '利用', '者', 'チェック', 'いかが', 'LINE', '関連', '記事', 'ソニー', 'F', '3', 'ズームレンズ', 'テスト', 'ビデオ', 'SALON', '会議', '室', '教室', '価 格', '汎用', '性', '3', 'D', '対応', 'プロジェクター', 'DELL', '発売', '売れ筋', 'チェック', 'ZACUTO', '社', '製', 'キヤノン', 'C', '300', '用', 'アクセサリー', '発売', 'ビデオ', 'SALON', '時期', '頼り', 'の', '空気', '清浄', '機', '豪徳寺', '美鈴', 'ゲット', 'の', 'コレ', '家電', '女', '四', '話', 'AKB',
 '前田', '敦子', 'ネタ', 'ファン', '激怒', '日本一', '下世話', 'クイズ', '番組', 'ネット', '話題', '話題']