個人的神殿

プログラミング

セネカ『人生の短さについて』 要約とまとめ

1.人生というのはあまりにも短いため、人生の用意がなされた途端に人生に見放されてしまうと言う人が多い。しかし我々の人生は短いのではなく、その時間の多くを浪費している。つまり我々は人生を短くしているのだ。財産も時間も使い方が重要である。


2.他人のために時間を使ってばかりで、自分自身を省みず、自分自身には耳を貸そうとしないのだ。


3.今にも死ぬかのように全てを恐怖するが、それと同時にいつまでも死なないかのように全てを熱望する。○歳からは暇になる、というが、人はいつ死ぬか分からないということを忘れている人間の言葉だ。


4.大きい権力を持ち、高い身分に登った人でも「暇が欲しい。」と言う。彼は暇になっている自分を希望し、それを想像することで自分を慰めていた。


5.キケロは友への手紙の中で、自分のことを「半ば自由を失った者」と言って過去の歳月を嘆き、現実に不満を述べて将来に絶望している。


6.他人の目には幸福に見えても、その本人は実は嘆いている。人生の期間は常に流れ去っていくもので、理性によって延ばすことはできるが速やかに我々を見捨てて行ってしまう。


7.生きること、そして死ぬことは生涯をかけて学ぶべきことである。多くの大偉人は一切の邪魔者を退け、財産も公職も快楽も捨てた。ただいかに生きるかを知ろうとするし、それでも分からないと白状するレベルだ。彼らは自分の時間から何一つ取り去られることを許さないのだ。


8.誰一人として時間を評価する者はいない。しかし、死の危険が迫ってくると途端にその価値を改めて実感する。大きい感情の矛盾である。時間を失うというのは目に見えない損害なのだ。


9.事を先に引き伸ばすのは、生活をはるか遠くに投げ出すこと。明日に依存し、今日を失う。将来のことはすべて不確定要素のうちに入る。今直ちに生きようとしなければならん。
「幸薄き多忙な人間共にとって、まさに生涯の最良の日は、真っ先に逃げていく。」


10~12.多忙な人間とはどういうことか?ただ忙しい人というだけでなく、くだらないことばかりを常に気にしているような者や、また甘やかされており自分が今何をやっているかを知らない者のことだ。
本当に暇のある人というのは、自分の暇の何であるかについても気づいている人のことなのだ。


13.将棋とか球技とか、そんなことに熱中して人生を浪費する人も暇のある人ではない。またくだらない問題ににムダな努力を払っている人もそうだ。そのような知識が誰をますます勇敢に、正しく、自由にしてくれるのか?


~以下から結論部分に入る~


14.英知に専念する人のみが暇のある人であり、そういう人のみが本当に生きているという言うべきだ。真の職務に携わっている者といえるのは、ゼノンやアリストテレスのような人たちを、毎日最も親しい友だちのようにしたいと望む者だ。彼らは決して留守にしないし、君たちを追い返すようなこともしない。


15.よく言うように、どんな両親を引き当てようとも、それは我々の力ででどうすることもできなかったことであり、偶然によって人間に与えられたものである。とはいえ、我々は自己の裁量で、誰の子にでも生まれることができる。どれでも養子に入りたい家庭を選ぶが良い。


16.多忙な生活から見放されると、暇の中に取り残されてしまう人もいる。その暇をどう使うべきか分からないし、次から次へと別の快楽に乗り移ってある一つの欲望に終始できないのだ。


17.このような者たちの快楽そのものすら不安定であり、歓喜の絶頂の最中に、「これがいつまで続くだろう」という不安な憂いに襲われる。新しい多忙が古い多忙にとって代わり、希望が希望を、野心が野心を駆り立てる。


18.多忙なパウリヌス(弟子)よ、公的な生活からは身を引くべきだ。君は、今まで熱心にしてきたすべての仕事よりも、もっと大きな仕事を見つけるであろう。君は退いて心静かにそれを実行するがよい。自分自身の人生の利益を知るほうが、公共の穀物の利益を知るよりも、もっと有益なことである。


19.このような暇のある生活において君を待ち構えているのは、幾多の立派な仕事である。すなわち徳の愛好と実践であり、情欲の忘却であり、生と死の認識であり、深い安静の生活である。


20.高い身分や名声のために人生を空費するな。死ぬまで現役でありたいと願うのも愚かだ。自分の葬式の段取りなど無駄だからやめるべきだ。



「人生の短さについて」を俺なりにまとめるとこうなる。



『英知の獲得に専念せよ。』



要は、くだらないことのために時間を浪費せず、真理の探求のために時間を使うべきだということだろうね。
そのためには先人と友達になったり、またその家庭に養子に入る、つまり先人の考えを学ぶことから始めるのが良いだろうと言っている。


ちなみに俺には恥ずかしながら人生の目的の1つとして「魔術の習得」というものがある。

この人生の短さについてというものを読んだとき、英知の獲得のための手段と魔術の習得のための手段は非常に似ていると感じた。

ここで話されている英知の獲得のための手段としては、ソクラテスなどがやっていた「正義とは何かを探求する」といった行為のことを指しているのだと思うが、魔術の場合は「五感では感じ取ることのできない現実を探求する」「自分の意識の中に自由自在に変革を起こす技術を身につけるための修行をする」である。

魔術の定義は色々とあるのでここでは詳しくは書かないが、どちらにしても怠けたような生活をしていては到底得られるものではない。

とはいえ誰だって怠惰や放蕩に流されることもある。俺もそうだし。
そして今は労働を肩代わりしてくれるような奴隷もいないからお金を稼ぐためにある程度は働かなくてはいけない。

でも常に「英知の獲得」を念頭に置いておこうと思う。
怠惰な自分を受け入れつつ、それでも意志は失なわない。
少しずつでも混沌から光へ近づいていきたいと思っている。

pythonの標準ライブラリを知る ~random~

randomは、ランダムな浮動小数点や整数を取得するためのライブラリ。
ただ機密性が低いため、セキュリティが関わっている場合には使うべきではない。

1.random.random()
random.random()は、0.0以上1.0未満  0. 0 <= float型 < 1. 0  の浮動小数点数を返す。

import random

print(random.random())

0.6964593221533264

2.random.uniform()
random.uniform()は、小さい方の引数値 <= float型 <= 大きい方の引数値 を満たす浮動小数点数を返す。

import random

print(random.uniform(10, 100))
print(random.uniform(1.234, 5.678))
85.58939439679385
2.9936771686914847


3.random.randint()
random.randint()は渡された2つの引数の範囲 第1引数値 <= int型 <= 第2引数値 を満たす整数を返す。
ちなみに第2引数より第1引数が大きいとエラーになる。
引数はint型のみ。

import random

print(random.randint(10, 100))
44


4.random.randrange()
random.randrange()は、第1引数値以上、第2引数値未満、第3引数値間隔 での整数を返す。
・第1引数のみ……0以上、引数値未満の整数
・第1、第2引数のみ……第1引数値以上、第2引数値未満の整数
・第1、第2、第3引数……第1引数値以上、第2引数値未満(第3引数値間隔)の整数を返す。

import random

print(random.randrange(100))
print(random.randrange(30, 100))
print(random.randrange(1, 10, 1))
99
30
8

5.random. shuffle()
random.shuffle()は渡したリストの要素をランダムに並び替える。
並び替えたリストを返すのではなくて、渡したリストそのものを並び替える。

import random

list1 = [1, 2, 3, 4, 5]
print(list1)
random.shuffle(list1)
print(list1)
[1, 2, 3, 4, 5]
[3, 1, 2, 4, 5]

6.random.sample()
random.sample()は、渡したリストの要素をランダムに並び替えたものを返す。
random.shuffle()と違って、渡したリストそのものに変化は無い。
第2引数には、取得して並び替えたい要素の数を指定する必要がある。

import random

list1 = [1, 2, 3, 4, 5]
new_list1 = random.sample(list1, len(list1))
print(list1)
print(new_list1)

list2 = ["a", "b", "c", "d", "e"]
new_list2 = random.sample(list2, 2)
print(list2)
print(new_list2)
[1, 2, 3, 4, 5]
[1, 5, 3, 4, 2]
['a', 'b', 'c', 'd', 'e']
['a', 'c']

pythonの標準ライブラリを知る ~sys~

sysとかosとかいろいろとあるのは知っているが具体的に調べたことが全く無かったので、今回はコードを書きつつその挙動を確認したい。


sysPythonインタプリタの動作や、実行環境に関連する変数や関数のライブラリ。
主に プラットフォーム環境やスクリプト実行時に渡されたパラメータの取得やプログラムの終了に使用する。

1 sys.platform
sys.platformは、プラットホーム環境(win32, linuxなど)を教えてくれる。

import sys

print(sys.platform)
win32


2 sys. path
sys.pathにはPYTHONPATH環境変数のリストが格納されている。
sys. path[0]が実行したスクリプトディレクトリパスである。
PYTHONPATH環境変数については以下のサイトが参考になった
web-camp.io

import sys 

print(" 実行スクリプトのディレクトリパス")
print( sys.path[0])
print(" PYTHONPATH の 環境変数")
print( sys.path[1:])
['C:\\Users\\user\\Anaconda3\\python37.zip', 'C:\\Users\\user\\Anaconda3\\DLLs', 'C:\\Users\\user\\Anaconda3\\lib', 'C:\\Users\\user\\Anaconda3', 'C:\\Users\\user\\AppData\\Roaming\\Python\\Python37\\site-packages', 'C:\\Users\\user\\Anaconda3\\lib\\site-packages', ]


3 sys.argv
sys.argvはコマンドライン引数のリストを取得する。argv[0]には実行スクリプトの名前が入っている。

import sys

print("実行スクリプトの名前")
print( sys.argv[0])
print("コマンドライン引数のリスト")
print( sys.argv[1:])

py normallib.py math 38 という風に引数を渡してあげると……

$ py normallib.py math 38
実行スクリプトの名前
normallib.py
コマンドライン引数のリスト
['math', '38']

4 sys.exit()
sys.exit()はプログラムを終了させる。

import sys

print("sys.exit()より前なので出力される")
sys.exit()
print("sys.exit()より後なので出力されない")
sys.exit()より前なので出力される

5 sys.exc_info()
sys.exc_info()は、現在処理中の例外をタプルにして返す。
現在というのは基本的にはexceptブロック内の事を指す。
このタプルは3つの値を持ち、例外が発生がしてない時はそれぞれNoneになる。
何の例外が起きたかをログに残したい時に便利っぽい。

import sys

try:
    print("ここではまだ例外は発生していない")
    print(sys.exc_info())
    sys.exit()
except:
    print("現在処理中の例外")
    print(sys.exc_info())

print("現在はもう例外処理中ではなくなった")
print(sys.exc_info())
ここではまだ例外は発生していない
(None, None, None)
現在処理中の例外
(<class 'SystemExit'>, SystemExit(), <traceback object at 0x000001CFD29EBA08>)
現在はもう例外処理中ではなくなった
(None, None, None)

6 sys.executable
sys.executableには、pythonインタプリタ絶対パスが格納されている。

import sys

print("インタプリタの絶対パス")
print(sys.executable)
インタプリタの絶対パス
C:\Users\user\Anaconda3\python.exe

7 sys.version
sys.versionでは、pythonインタプリタのバージョンを確認できる。

import sys

print("インタプリタのバージョン")
print(sys.version)
インタプリタのバージョン
3.7.1 (default, Dec 10 2018, 22:54:23) [MSC v.1915 64 bit (AMD64)]

8 sys.version_info
sys.version_infoはインタプリタのバージョン情報を名前付きタプルで返す。値を抜き取りたい場合はこちらを使う。
名前付きタプルについては下記を参照。
qiita.com

import sys

print("インタプリタのバージョン(名前付きタプル)")
print(sys.version_info)
print("major={0}".format(sys.version_info.major))
print("minor={0}".format(sys.version_info.minor))
print("micro={0}".format(sys.version_info.micro))
print("releaselevel={0}".format(sys.version_info.releaselevel))
print("serial={0}".format(sys.version_info.serial))
インタプリタのバージョン(名前付きタプル)
sys.version_info(major=3, minor=7, micro=1, releaselevel='final', serial=0)
major=3
minor=7
micro=1
releaselevel=final
serial=0

9 sys.copyright
sys.copyrightにはpythonインタプリタ著作権に関する文字列が格納されている。

import sys

print("インタプリタの著作権")
print(sys.copyright)
インタプリタの著作権
Copyright (c) 2001-2018 Python Software Foundation.
All Rights Reserved.

Copyright (c) 2000 BeOpen.com.
All Rights Reserved.

Copyright (c) 1995-2001 Corporation for National Research Initiatives.
All Rights Reserved.

Copyright (c) 1991-1995 Stichting Mathematisch Centrum, Amsterdam.
All Rights Reserved.

10 sys. getwindowsversion()
sys.getwindowsversion()はWinidowsのバージョン情報を返す。

import sys

print("Windowsのバージョン")
print(sys.getwindowsversion())
Windowsのバージョン
sys.getwindowsversion(major=10, minor=0, build=17763, platform=2, service_pack='')

言語処理100本ノック 第5章 CaboChaを使うための環境構築

pythonでCaboChaを使うための、最初の環境構築で滅茶苦茶つまづいたが、おおむね以下の3つのサイトにお世話になった。
qiita.com
hytmachineworks.hatenablog.com
qiita.com

CaboChaや係り受け解析についての詳しい説明はこちらを見ると良い。
qiita.com

まずは試しに基本的なことをやってみる。

import CaboCha
c = CaboCha.Parser()
sentence = "太郎はこの本を次郎を見た女性に渡した。"

tree = c.parse(sentence)

print(tree.toString(CaboCha.FORMAT_TREE))
  太郎は-----------D
      この-D       |
        本を---D   |
        次郎を-D   |
            見た-D |
            女性に-D
            渡した。

表示の仕方をいろいろと変えることができる。

print(tree.toString(CaboCha.FORMAT_LATTICE))
* 0 6D 0/1 -2.457381
太郎    名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
* 1 2D 0/0 1.532201
この    連体詞,*,*,*,*,*,この,コノ,コノ
* 2 4D 0/1 0.091699
本      名詞,一般,*,*,*,*,本,ホン,ホン
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
* 3 4D 1/2 2.132370
次      名詞,一般,*,*,*,*,次,ツギ,ツギ
郎      名詞,一般,*,*,*,*,郎,ロウ,ロー
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
* 4 5D 0/1 1.416783
見      動詞,自立,*,*,一段,連用形,見る,ミ,ミ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
* 5 6D 0/1 -2.457381
女性    名詞,一般,*,*,*,*,女性,ジョセイ,ジョセイ
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
* 6 -1D 0/1 0.000000
渡し    動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。      記号,句点,*,*,*,*,。,。,。
EOS
print(tree.toString(CaboCha.FORMAT_XML))
<sentence>
 <chunk id="0" link="6" rel="D" score="-2.457381" head="0" func="1">
  <tok id="0" feature="名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー">太郎</tok>
  <tok id="1" feature="助詞,係助詞,*,*,*,*,は,ハ,ワ">は</tok>
 </chunk>
 <chunk id="1" link="2" rel="D" score="1.532201" head="2" func="2">
  <tok id="2" feature="連体詞,*,*,*,*,*,この,コノ,コノ">この</tok>
 </chunk>
 <chunk id="2" link="4" rel="D" score="0.091699" head="3" func="4">
  <tok id="3" feature="名詞,一般,*,*,*,*,本,ホン,ホン">本</tok>
  <tok id="4" feature="助詞,格助詞,一般,*,*,*,を,ヲ,ヲ">を</tok>
 </chunk>
 <chunk id="3" link="4" rel="D" score="2.132370" head="6" func="7">
  <tok id="5" feature="名詞,一般,*,*,*,*,次,ツギ,ツギ">次</tok>
  <tok id="6" feature="名詞,一般,*,*,*,*,郎,ロウ,ロー">郎</tok>
  <tok id="7" feature="助詞,格助詞,一般,*,*,*,を,ヲ,ヲ">を</tok>
 </chunk>
 <chunk id="4" link="5" rel="D" score="1.416783" head="8" func="9">
  <tok id="8" feature="動詞,自立,*,*,一段,連用形,見る,ミ,ミ">見</tok>
  <tok id="9" feature="助動詞,*,*,*,特殊・タ,基本形,た,タ,タ">た</tok>
 </chunk>
 <chunk id="5" link="6" rel="D" score="-2.457381" head="10" func="11">
  <tok id="10" feature="名詞,一般,*,*,*,*,女性,ジョセイ,ジョセイ">女性</tok>
  <tok id="11" feature="助詞,格助詞,一般,*,*,*,に,ニ,ニ">に</tok>
 </chunk>
 <chunk id="6" link="-1" rel="D" score="0.000000" head="12" func="13">
  <tok id="12" feature="動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ">渡し</tok>
  <tok id="13" feature="助動詞,*,*,*,特殊・タ,基本形,た,タ,タ">た</tok>
  <tok id="14" feature="記号,句点,*,*,*,*,。,。,。">。</tok>
 </chunk>
</sentence>
print(tree.toString(CaboCha.FORMAT_CONLL))
1       太郎    太郎    名詞    名詞-固有名詞-人名-名   feature=名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー|begin_chunk=1|head=1        2       _       _       _
2       は      は      助詞    助詞-係助詞     feature=助詞,係助詞,*,*,*,*,は,ハ,ワ|func=1     13        D       _       _
3       この    この    連体詞  連体詞  feature=連体詞,*,*,*,*,*,この,コノ,コノ|begin_chunk=1|head=1|func=1       4       D       _       _
4       本      本      名詞    名詞-一般       feature=名詞,一般,*,*,*,*,本,ホン,ホン|begin_chunk=1|head=1       5       _       _       _
5       を      を      助詞    助詞-格助詞-一般        feature=助詞,格助詞,一般,*,*,*,を,ヲ,ヲ|func=1    9       D       _       _
6       次      次      名詞    名詞-一般       feature=名詞,一般,*,*,*,*,次,ツギ,ツギ|begin_chunk=1      7       _       _       _
7       郎      郎      名詞    名詞-一般       feature=名詞,一般,*,*,*,*,郎,ロウ,ロー|head=1   8        _       _       _
8       を      を      助詞    助詞-格助詞-一般        feature=助詞,格助詞,一般,*,*,*,を,ヲ,ヲ|func=1    9       D       _       _
9       見      見る    動詞    動詞-自立       feature=動詞,自立,*,*,一段,連用形,見る,ミ,ミ|begin_chunk=1|head=1 10      _       _       _
10      た      た      助動詞  助動詞  feature=助動詞,*,*,*,特殊・タ,基本形,た,タ,タ|func=1    11        D       _       _
11      女性    女性    名詞    名詞-一般       feature=名詞,一般,*,*,*,*,女性,ジョセイ,ジョセイ|begin_chunk=1|head=1     12      _       _       _
12      に      に      助詞    助詞-格助詞-一般        feature=助詞,格助詞,一般,*,*,*,に,ニ,ニ|func=1    13      D       _       _
13      渡し    渡す    動詞    動詞-自立       feature=動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ|begin_chunk=1|head=1  14      _       _       _
14      た      た      助動詞  助動詞  feature=助動詞,*,*,*,特殊・タ,基本形,た,タ,タ|func=1    15        _       _       _
15      。      。      記号    記号-句点       feature=記号,句点,*,*,*,*,。,。,。      0       _        _       _

何だか長くなりそうなので問題は次の記事で解くことにしよう。

デイヴィッド・コンウェイ『魔術 理論編』を読む イントロダクション

他の動物達はうつむきになって、

目を地面に向けているのにたいして、

人間だけは顔をもたげて天を仰ぐようにさせ、

まっすぐ目をあげて空を見るようにいいつけた。

(オウディウス『変身物語』)

 

 

 

序文をとばして緒言(イントロダクション)から

p31

しかし宗教が超自然を公式の神学の枠内に限定し、信者もそれを受け入れなければならないのに対し、オカルティズムのほうは超自然を自ら体験するように、支持者にハッパをかけるのだ。

オカルト(occult)の意味について調べてみると……

eow.alc.co.jp

オカルトというのは決して空想とか妄想の類の意味ではないみたいだな。
隠されている、肉眼では発見できない、人間の理解を超えている、しかし現実に存在しているモノ、コトをオカルトと言うのか。

なるほどオカルティズムというのは、そういった五感で捉えられないもの(目で見たり耳で聞いたりできないもの)を何とかして捉えたい、探求していきたいという姿勢のことらしい。

一応宗教もオカルトの1つではあるが、例えば宗教は聖典に書かれている内容は無条件で受け入れることを望む、つまり宗教が受動的なものであるのに対して、オカルティズムというのは何でもかんでも受け入れるのではなくて、全てを自分の頭で考えてみようという能動的なものであるというわけか。

p32

日頃慣れ親しんだ物質界の彼方にも現実があるかもしれないと考えている。そしてこうした人たちにとってオカルティズムとは、その別の現実を探求することなのである。

 オカルティズムというのは空想に浸ることではなくて、あくまで探求の対象は現実なのだと強調している。ただその現実は、科学に支配されている物質界からは見えないってことか。

p33

オカルティズムの恵みの中には、ひとりひとりが自力で個別に超自然を体験させてもらえるということもあるのだから。超自然というのは、もう一度言わせてもらえば、五感ではとらえがたいとはいうものの、決して非現実的ではない次元という意味である。

非現実的ではない次元というのはどういうことなのだろうかと思っていたら後ろの方にあった例えの中に、瞑想や、ドラッグによる聴覚視覚体験というものがあった。

うーん、ドラッグの場合は通常の五感を無理やり増幅してるからそれは超自然ではなくて五感で捉えているものだと思うんだよな。

ただ瞑想の場合は、何となくスッキリした気がするとかそういった曖昧な感覚を得られるのは確かだと思うし、もしそういう感覚を自由自在に操れるとしたらそれはすごいことだと思う。

 p34

逆に科学の前提条件(いかに物質論的なものでも)と矛盾しないとわかれば、魔術はまともにとりあげるに値するということが証明されたことになる。

魔術が常識や理性、科学思想と矛盾しない ということをこれから証明していきたいと言う。
科学も魔術も現実を探求するということは共通しているが、科学の場合は五感で捉えられるものを通して現実を探求していくのに対し、魔術の場合は五感では捉えられないものを通して現実を探求していく、結局科学も魔術も目的は同じなのだから矛盾するのはおかしいということかな。

 

とりあえずプロローグで大事そうな部分はこれぐらい。 

初めて耳コピをした

前々からDominoという無料作曲ソフトで打ち込んだりして遊んだりはしていたんだけど、あまりちゃんとコピーしたりする気力が無かった。

というのも音がしょぼくてどんなに頑張ってもスーパーなどで流れてる音楽にしか聞こえなかったからだ。

んじゃ無料で使えるもうちょい高度なソフトを使ってみようと思ったがとにかく難しい。解説を見ても全く分からない。というかあまり解説が無い。

俺はけっこう飽きっぽいのでそのソフトはすぐにアンインストールした。

 

で、タイトルにもある通り、今回1曲をちゃんと耳コピした。

実はDominoで音源を差し替えることができることを知って、試してみたところこれがビンゴ、素晴らしい。

twintailnu.hatenablog.com


いきなり臨場感溢れる音に感動して、これは何かやらなければと思った俺はちょうど今ハマっているサンホラの黒の予言書を頑張ってコピってみることにした。

 

 で、一応できたものも載せておく。

 

これからもちょいちょいやってみようと思う。

本当は作曲がしてみたいんだけど、やっぱそれなりに音楽理論とかも身に着けないといけないっぽい。ただ今は時間が無いのでまぁそのうちってことで。 

 

言語処理100本ノック 第4章

30.
Mecabにはほとんど触ったことが無かったが、とにかく見様見真似でやってみる。
ちなみに最初while文の中でnode = node.nextを書き忘れて無限ループに陥り、PCがフリーズしてしまったので再起動した。

import MeCab
def map_text(text_file):
    with open(text_file, encoding = "utf-8") as fp:
        sentences = []
        lines = fp.readlines() # list
        tagger = MeCab.Tagger("-O chasen")
        tagger.parse('')

        for line in lines:
            sentence = []
            node = tagger.parseToNode(line.replace("\n", "").replace(" ", ""))

            while node:
                if node.surface == "":
                    node = node.next
                    continue

                surface = node.surface
                base = node.feature.split(",")[6]
                pos = node.feature.split(",")[0]
                pos1 = node.feature.split(",")[1]

                word = {
                    "surface": surface,
                    "base": base,
                    "pos": pos,
                    "pos1": pos1
                }

                sentence.append(word)
                node = node.next

            if sentence:
                sentences.append(sentence)
        
        return sentences

def create_result_file(text_file):
    sentences = map_text(text_file)
    with open("neko.txt.mecab", "w", encoding = "utf-8") as result_file:
        for sentence in sentences:
            result_file.write(str(sentence) + "\n")

create_result_file("neko.txt")
[{'surface': '一', 'base': '一', 'pos': '名詞', 'pos1': '数'}]
[{'surface': '吾輩', 'base': '吾輩', 'pos': '名詞', 'pos1': '代名詞'}, {'surface': 'は', 'base': 'は', 'pos': '助詞', 'pos1': '係助詞'}, {'surface': '猫', 'base': '猫', 'pos': '名詞', 'pos1': '一般'}, {'surface': 'で', 'base': 'だ', 'pos': '助動詞', 'pos1': '*'}, {'surface': 'ある', 'base': 'ある', 'pos': '助動詞', 'pos1': '*'}, {'surface': '。', 'base': '。', 'pos': '記号', 'pos1': '句点'}]
[{'surface': '名前', 'base': '名前', 'pos': '名詞', 'pos1': '一般'}, {'surface': 'は', 'base': 'は', 'pos': '助詞', 'pos1': '係助詞'}, {'surface': 'まだ', 'base': 'まだ', 'pos': '副詞', 'pos1': '助詞類接続'}, {'surface': '無い', 'base': '無い', 'pos': '形容詞', 'pos1': '自立'}, {'surface': '。', 'base': '。', 'pos': '記号', 'pos1': '句点'}]
[{'surface': 'どこ', 'base': 'どこ', 'pos': '名詞', 'pos1': '代名詞'}, {'surface': 'で', 'base': 'で', 'pos': '助詞', 'pos1': '格助詞'}, {'surface': '生れ', 'base': '生れる', 'pos': '動詞', 'pos1': '自立'}, {'surface': 'た', 'base': 'た', 'pos': '助動詞', 'pos1': '*'}, {'surface': 'か', 'base': 'か', 'pos': '助詞', 'pos1': '副助詞/並立助詞/終助詞'}, {'surface': 'とんと', 'base': 'とんと', 'pos': '副詞', 'pos1': '一般'}, {'surface': '見当', 'base': '見当', 'pos': '名詞', 'pos1': 'サ変接続'}, {'surface': 'が', 'base': 'が', 'pos': '助詞', 'pos1': '格助詞'}, {'surface': 'つか', 'base': 'つく', 'pos': '動詞', 'pos1': '自立'}, {'surface': 'ぬ', 'base': 'ぬ', 'pos': '助動詞', 'pos1': '*'}, {'surface': '。', 'base': '。', 'pos': '記号', 'pos1': '句点'}]

31.
重複するかもしれないので集合で。

sentences = map_text("neko2.txt")
print({word["surface"] for sentence in sentences for word in sentence if word["pos"] == "動詞" })
{'あっ', '逢っ', '見', 'なら', 'いる', '思わ', '煮', '落ちつい', '捕え', '出会わ', '弱っ', 'のみ', 'さ', '思っ', 'られ
', 'れ', '吹く', 'つか', '載せ', '聞く', 'し', '食う', '残っ', 'せ', '飲む', '生れ', '持ち上げ', '知っ', '泣い', '始め
', ……}

32.

print({word["base"] for sentence in sentences for word in sentence if word["pos"] == "動詞"})

33.

print({word["surface"] for sentence in sentences for word in sentence if word["pos"] == "名詞" and word["pos1"] == "サ変接続"})

34.
名詞と名詞をつなぐ「の」の働きは連体化というらしい。
確かにその前後の単語は名詞になっている。
はずってたしかに名詞なんだがあまり名詞って感じがしないね。

for sentence in sentences:
    for i, word in enumerate(sentence):
        if word["pos1"] == "連体化":
            print(sentence[i - 1]["surface"] + "の" + sentence[i + 1]["surface"])
彼の掌
掌の上
書生の顔
はずの顔
顔の真中
穴の中

35.
ぷうぷうと とか ニャーニャーって名詞だったんだ(笑)

nouns_list = []

for sentence in sentences:
    nouns = []
    for word in sentence:
        if word["pos"] == "名詞":
            nouns.append(word["surface"])
        elif word["pos"] != "名詞" and nouns != []:
            nouns_list.append(nouns)
            nouns = []
nouns_list = sorted(nouns_list, key = lambda x: len(x), reverse = True)
print(nouns_list)
[['人間', '中'], ['一番', '獰悪'], ['時', '妙'], ['一', '毛'], ['その後', '猫'], ['一', '度'], ['ぷうぷうと', '煙'], ['吾輩'], ['猫'], ['名前'], ['どこ'], ['見当'], ['何'], ['所'], ['ニャーニャー'], ['いた事'], ['記憶'], ['吾輩'], ['ここ'], ['人間'], ['もの'], ['あと'], ['それ'], ['書生'], ['種族'], ['そう'], ['書生'], ['の'], ['我々'], ['話'], ['当時'], ['何'], ['考'], ['彼'], ['掌'], ['スー'], ['時'], ['感じ'], ['掌'], ['上'], ['書生'], ['顔'], ['の'], ['人間'], ['もの'], ['始'], ['もの'], ['感じ'], ['今'], ['装飾'], ['はず'], ['顔'], ['薬缶'], ['輪'], ['事'], ['顔'], ['真中'], ['突起'], ['穴'], ['中'], ['咽'], ['これ'], ['人間'], ['煙草'], ['もの'], ['事'], ['頃']]

36.
まぁ、助詞なども一応単語だから……。
それと第2章で学んだdefaultdictをここでも使ってみた。

from collections import defaultdict

word_nums = defaultdict(int)
for sentence in sentences:
    for word in sentence:
        if word["pos"] != "記号":
            word_nums[word["surface"]] += 1
word_nums = sorted(word_nums.items(), key = lambda x: x[1], reverse = True)
print(word_nums[:10])
[('た', 15), ('で', 12), ('て', 11), ('の', 10), ('は', 9), ('が', 9), ('という', 7), ('し', 6), ('ある', 4), ('人間', 4)]

37.
初めてmatplotlibを触った。
棒グラフを出すこと自体は難しくなかったが、文字化けがなかなか直らなかった。
結果的にこちらのサイトに通りにしたら直った。
tkstock.site

棒グラフはbarを使う。

from matplotlib import pyplot

x = [word[0] for word in word_nums[:10]]
y = [word[1] for word in word_nums[:10]]

pyplot.bar(x, y, label = "word_num_ranking")

pyplot.title("頻度上位10語")
pyplot.xlabel("単語")
pyplot.ylabel("出現数")
pyplot.show()

f:id:beyonce_t:20191021220542j:plain
頻度上位10単語

38.
ヒストグラムはhistを使う。第1引数にデータ、binsは棒の数、rangeは横軸の範囲。

from matplotlib import pyplot

pyplot.hist([word_num[1] for word_num in word_nums], bins = 30, range = (1, 30))
pyplot.title("種類別頻度")
pyplot.xlabel("出現頻度")
pyplot.ylabel("出現数")
pyplot.show()

f:id:beyonce_t:20191021223337j:plain
種類別頻度

39.

xscaleとyscaleにlogをセットすると、軸をlogスケールで描くことができるらしい。
from matplotlib import pyplot

y = [word_num[1] for word_num in word_nums]
x = list(range(1, len(y) + 1))

pyplot.plot(x, y)

pyplot.xscale('log')
pyplot.yscale('log')

pyplot.title("出現頻度順位")
pyplot.xlabel("出現頻度順位")
pyplot.ylabel("出現頻度")
pyplot.show()

f:id:beyonce_t:20191021230306j:plain
出現頻度順位