2020年11月27日金曜日

matplotlibの使い方

  matplotlibの使い方には、1. plt()で処理するpyplotインターフェースとfigやaxを定義した後にax.plotで書くオブジェクト指向インターフェースの2つがあるとのこと。(参考リンク)


1. pyplotインターフェース

#ライブラリの読み込み

import numpy as np
import matplotlib.pyplot as plt

#xとyの定義
x = np.linspace(-5, 5,10)
y = x ** 3

#グラフの表示

plt.plot(x, y)
plt.show()


 


2.オブジェクト指向インターフェース

#ライブラリの読み込み

import numpy as np
import matplotlib.pyplot as plt

#xとyの定義
x = np.linspace(-5, 5, 10)
y = x ** 3

#(空の)図の表示

fig = plt.figure()

#サブプロットパラメータ(111)は1×1グリッドを示す。(111)で良いみたい。

ax = fig.add_subplot(111)

#xとyのグラフの表示

ax.plot(x, y)
plt.show() 

参考リンク

pythonのmatplotlibの使い方をまとめてみた

matplotlib基礎 | figureやaxesでのグラフのレイアウト 

早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話

matplotlib documentation 

Matplotlib.pyplotのplotの全引数を解説

matplotlibのめっちゃまとめ 

In Matplotlib, what does the argument mean in fig.add_subplot(111)?


 

2020年11月26日木曜日

言語処理100本ノック2020 問題02

 問. 「パトカー」+「タクシー」の文字を先頭から交互に連結して文字列「パタトクカシーー」を得よ


解答例

#str2,str2でパトカーとタクシーを定義

str1 = "パトカー"
str2 = "タクシー"
 

#「パタトクカシーー」の出力先となる空の行列を入れたstr3を作る

str3 = ""

#zip関数を使ってstr3にstr1とstr2の文字を交互に入れていく
str4 = str3.join([i+j for i, j in zip(str1, str2)])
 

#str4を表示

print(str4)

 

出力

パタトクカシーー


では、str2とstr3を入れ替えるとどうなるのか。

str1 = "パトカー"
str2 = ""
str3 = "タクシー"

str4 = str3.join([ i+j for i,j in zip(str1,str2)])
print(str4)

出力

プロセスは終了コード 0 で完了しました

 何も出ませんね。str2が空行列のため、str4が作られなかった。

確認のためにstr2を空行列ではなく、「XXXXXX」とするとどうなるでしょうか。

str1 = "パトカー"
str2 = "XXXXXX"
str3 = "タクシー"

str4 = str3.join([ i+j for i,j in zip(str1,str2)])
print(str4)

 出力

パXタクシートXタクシーカXタクシーーX 


タクシーで1つの語なので、うまく混ざりませんでした。


参考リンク

【言語処理100本ノック 2020】第1章: 準備運動 

Python, zip関数の使い方: 複数のリストの要素をまとめて取得 

 



言語処理100本ノック2020 問題01

 問「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ.

 

解答例

#文字列の定義(別にstrでなくても好きな文字で良い)

str = "ぱたとくかしーー"

#行の最初から最後まで1文字空けて表示
ans1 = str[0:8:2]
print(ans1)

#行の2文字目から最後まで1文字空けて表示
ans2=str[1:8:2]
print(ans2) 


出力

ぱとかー
たくしー

 

解答例2:行の最初と最後の文字は省略することができる。

str = "ぱたとくかしーー"

ans1 = str[::2]
print(ans1)

ans2=str[1::2]
print(ans2)


Pythonによる文字列の数え方

 何番目の文字と数えるよりは、今回の場合であれば、

「^パ^タ^ト^ク^カ^シ^ー^ー^ 」

のように1文字ずつ空けて(^:記号)、0から数え始めると良い。

(1がスタートではありません。)




参考リンク

【言語処理100本ノック 2020】第1章: 準備運動 

 

 



2020年11月25日水曜日

言語処理100本ノック2020 問題00

 問:文字列”stressed”の文字を逆に(末尾から先頭に向かって)並べた文字列を得よ.

解答例

str = 'stressed'
#[::-1] 「先頭」から「末尾」まで「逆順の移動幅1」で
ans = str[::-1]
print(ans)

出力
desserts

別解

str = "stressed"
#for loopを逆順で回す
for word in reversed(str):
    print(word)

出力

d
e
s
s
e
r
t
s

答えが縦書きになった

 

参考リンク

【言語処理100本ノック 2020】第1章: 準備運動 

ループを逆順で回す方法 

 

2020年11月20日金曜日

for loopを使ったt-sne次元圧縮

MODEL100, MODEL200, MODEL300を読み込んで、次元圧縮を行い、FIGURE100.jpg, FIGURE200jpg, FIGURE300.jpgを保存する。

#ライブラリの読み込み
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
from gensim.models import word2vec

#for loopの設定
data = ['100', '200', '300']

for item in data:

#モデルの読み出し(以下はfor loopの中なのでインデントが必要。{}の中にloopの中身が入る。)
    model = word2vec.Word2Vec.load('MODEL{}.model'.format(item))

#x軸の決定
    X = model[model.wv.vocab]

#次元圧縮(次元数2、perplexity:次元圧縮の重要なパラメータ)
    tsne = TSNE(n_components=2, perplexity=30)


#次元圧縮後のx軸の決定
    X_tsne = tsne.fit_transform(X[:1000,:])

#保存先の図の準備(図を作る前に保存先の図を作っておく。)
    fig = plt.figure()

#図の作成(plt.scatterで書式を指定し、plt.show()で表示させる)
    plt.scatter(X_tsne[:, 0], X_tsne[:, 1])
    plt.show()

#図の保存。{}のところに上記と同じitemが入る
    fig.savefig("FIGURE{}.jpg".format(item))


.formatを使ったfor loopの書き方

number = ["1", "2", "3"]

# 変数kaisuuにnumberを順番に入れて表示(print)する
for kaisuu in number:
    print('This is {}time'.format(kaisuu))
#変数を入れるところを{}にしておき、.format()で変数を指定する。


出力結果

This is 1time
This is 2time
This is 3time

2020年11月17日火曜日

画像の保存(fig.savefig( ))

word2vec後、t-sneで次元圧縮した画像を保存する方法。

図をplt.showで作成する前に画像ファイルを作っておく。

#ライブラリの読み込み
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
from gensim.models import word2vec

#モデルの読み出し
model = word2vec.Word2Vec.load('MODEL.model')

#x軸の決定
X = model[model.wv.vocab]

#次元圧縮の定義
tsne = TSNE(n_components=2, perplexity=100)
#次元圧縮の計算
X_tsne = tsne.fit_transform(X[:1000,:])

#保存先の図の準備
fig = plt.figure()

#図の作成
plt.scatter(X_tsne[:, 0], X_tsne[:, 1])
plt.show()

#図の保存(拡張子を指定することで、図のフォーマットを決めることができる)

fig.savefig("FILENAME.jpg")

for loop 文(Python)

for loopを使って、曜日を順番に表示するプログラム

# リストyoubiの定義

youbi = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]

# 変数dayにyoubiを順番に入れて表示(print)する
for day in youbi:
    print(day)


【出力結果】

Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday 

ファイルを読み込むときは

f = open('file.txt')

for day in f:

    print(day)

と書けばよい。

2020年11月16日月曜日

vocab, index2word, syn0について

 word2vecでよく出てくるvocab, index2word, syn0について

 

vocab

辞書になっていて、keyは「単語」、valueは「gensim.models.keyedvectors.Vocab」になっている。

vocab = model.wv.vocab

 

 

index2word

形式はリスト。要素は「単語」が入っている。

index2word = model.wv.index2word

 

 

syn0

全ての単語ベクトルを返す

word_vectors = model.wv.syn0

 

参考リンク

gensimのWord2Vecを使ってみる。 

 

 

 

 

word2vecから語彙をファイルに保存する。

 語彙の保存(例:最初から1000番目まで)

#ライブラリの読み込み
from gensim.models import word2vec

#計算モデル(MODEL.model)の読み込み
model = word2vec.Word2Vec.load("MODEL.model")

#vocabの定義
vocab = model.wv.index2word

#ファイル(OUTPUT.txt)に書き込む
with open('OUTPUT.txt', 'w') as f:
    print(vocab[0:1000], file = f)

 

類似度ベクトルやベクトル間の距離の計算

#ライブラリの読み込み
from gensim.models import Word2Vec

# 計算済モデル(MODEL.model)の読み込み
model = Word2Vec.load("plant_sen100.model")

#ベクトルそのものと次元数を表示する#

#特定のベクトル(KEYWORD_A)定義
vector = model.wv["KEYWORD_A"]
 

#ベクトルを表示する
print(vector)

#ベクトルの次元数を表示する
print(vector.shape)

#単語ベクトル間の距離を計算する#

#全体ベクトルを定義する
vectors=model.wv

#ベクトル(KEYWORD_A,KEYWORD_B)間の距離の定義
distance = vectors.distance("KEYWORD_A", "KEYWORD_B")

#距離を小数点以下4桁まで表示する
print(f"{distance:.4f}")

#2つの単語の類似度(similarity)を計算する#
#similarityの定義
similarity = vectors.similarity("KEYWORD_A", "KEYWORD_B")

#類似度を小数点以下4桁まで表示する
print(f"{similarity:.4f}")

 

 

tips:wvはword vectorの略


gensim word2vecで複数のモデルファイルが作成される。

 今までより、次元数を増やしてgensim word2vecを計算していたところ、計算モデルが複数のファイルに出力されるようになった。(計算モデルはMODEL.modelと指定)

・MODEL.model

・ MODEL.model.trainables.syn1neg.npy

・MODEL.model.wv.vectors.npy

 

MODEL.modelのファイルサイズは、それまでの計算ファイルと比較しても小さいが、これら3つのファイルを同じフォルダにおいておけば、wordvectorの計算は今まで同様にできている。調べたところ、次元数を増やしたりして、データ数を増えると、自動的にファイルを分割するようだ。 


参考リンク

gensim word2vecで複数のモデルファイルが作成されるのはなぜですか?

creating word2vec model syn1neg.npy extension 


Pycharmでjupyter notebookを使う方法

 Pycharmのメニューから「ファイル」→「設定」→「Pythonインタプリター」で「Jupyter」パッケージをインストールする。

 

その後、 Pycharm下部のタブから「ターミナル」を開いて、「jupyter notebook」と入力すると立ち上がる。

 

参考リンク

PyCharmでjupyter notebookを使用する方法(Windows10) 

 

 

給油(アウトバック)

レギュラーガソリン54.17L給油。122円/L。ODO:66657km, Trip:446.9km。8.25km/L

Pythonによるword2vec計算モデルを対象としたt-sneとpcaのコードの比較

word2vecで計算済みのモデル(MODEL.model)を呼び出して、t-sneとpcaで次元圧縮を行い、2次元に図示する。

ポイント:

t-sneはsklearn.manifordで呼び出し、pcaはsklearn.decompositionで呼び出す。

 

【t-sneのコード】

from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
from gensim.models import word2vec

#モデルの読み出し
model = word2vec.Word2Vec.load('MODEL.model')

#x軸の決定
X = model[model.wv.vocab]

#次元圧縮の定義
tsne = TSNE(n_components=2)

#次元圧縮後のx軸の決定
X_tsne = tsne.fit_transform(X[:1000,:])

#図の作成
plt.scatter(X_tsne[:, 0], X_tsne[:, 1])
plt.show() 


 



【pcaのコード】

#ライブラリの読み込み
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
from gensim.models import word2vec

#モデルの読み出し
model = word2vec.Word2Vec.load('MODEL.model')

#x軸の決定
X = model[model.wv.vocab]

#2次元圧縮の定義
pca = PCA(n_components=2)


#次元圧縮後のx軸の決定
X_PCA = pca.fit_transform(X[:1000,:])


#図の作成
plt.scatter(X_PCA[:, 0], X_PCA[:, 1])
plt.show() 

参考リンク

sklearn.manifold.TSNE

sklearn.decomposition.PCA 

 



 

2020年11月15日日曜日

word2vecでの色々な結果の表示方法

#ライブラリの読み込み
from gensim.models import Word2Vec

# モデルの読み込み
model = Word2Vec.load("MODEL.model")

#modelベクトルの行列要素を表示(語彙と次元数)
print(model.wv.vectors.shape)

#model.wv.vectorsのうち、1つ目のベクトルを表示
print(model.wv.vectors[0])

#辞書に登録された語彙の数を示す
print(len(model.wv.index2word))

#辞書に登録された語彙を全て示す
print(model.wv.index2word)

#辞書に登録された語彙(1番目から10番目)を示す
print(model.wv.index2word[0:10])
 
参考リンク:Word2Vecの学習済みmodelを扱う備忘録

2020年11月12日木曜日

pythonライブラリをgithubから直接インストールする方法

pip install git+「githubのページ」

例)pip install git+https://github.com/materialsintelligence/mat2vec


参考リンク

t-sneの結果を可視化してくれるサイト

 Embedding Projector

word2vecの計算オプションについて

 【コード】

 #ライブラリの読み込み
from gensim.models import word2vec
import logging

#計算中のログを出力する
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

#文章ファイルの読み込み
files = word2vec.LineSentence('DATA.txt')

#モデルの作成=word2vecの計算
model = word2vec.Word2Vec(files, sg=1, size=100, min_count=2, window=5, sample=1e-3)

#モデルの保存
model.save("MODEL.model")


【word2vec.pyで見たWord2vecの計算オプション】

__init__(self, sentences=None, corpus_file=None, size=100, alpha=0.025, window=5, min_count=5,
                 max_vocab_size=None, sample=1e-3, seed=1, workers=3, min_alpha=0.0001,
                 sg=0, hs=0, negative=5, ns_exponent=0.75, cbow_mean=1, hashfxn=hash, iter=5, null_word=0,
                 trim_rule=None, sorted_vocab=1, batch_words=MAX_WORDS_IN_BATCH, compute_loss=False, callbacks=(),
                 max_final_vocab=None):


【オプションの説明】
sentences=None:
corpus_file=None:
size=100:基底とする単語ベクトルの数。これだと1つの単語を100次元のベクトルで表現する。
alpha=0.025:学習係数。
window=5:参照にする前後それぞれの単語数
min_count=5:登場回数がこの回数未満の単語を切り捨てる
max_vocab_size=None,
sample=1e-3,
seed=1,
workers=3: 並列計算を行う数
min_alpha=0.0001,
sg=0:計算に使用するモデル。 cbowの時は0、skip-gramであれば1
hs=0: 階層化ソフトマックス(頻度の低い単語に対して優れている。)を使うときは1
negative=5:ネガティブサンプリングに用いる単語数(ネガティブサンプリングを使うときはhs=0にしておくこと。)
ns_exponent=0.75,
cbow_mean=1,
hashfxn=hash,
iter=5:反復回数。ニューラルネットワークにおけるepochと同じ。
null_word=0,
trim_rule=None,
sorted_vocab=1:1の時は語彙を出現頻度でソートする。
batch_words=MAX_WORDS_IN_BATCH,
compute_loss=False,
callbacks=(),
max_final_vocab=None

参考リンク

gemsimのword2vecのためのオプション一覧

word2vec のオプション一覧 

alphaとmin_alphaのdoc2vecのデフォルト値

頻度の低い単語に対しては階層的なソフトマックスが優れているのに対し、頻度の高い単語に対してはネガティブサンプリングが優れているのはなぜですか? 

Negative Sampling(1/4)発明の概要

 図解Word2vec


Linuxにpipが入らなかったら

sudo apt update
sudo apt upgrade
sudo apt update
を行ったのち
 

sudo apt install python3-pip
と入力する。

参考リンク:WSL2にpip3をインストール

2020年11月11日水曜日

PycharmのPythonライブラリのバージョンについて

 PycharmのPythonライブラリのバージョンをあげてしまうと、他のライブラリから参照したときにエラーとなって、使えなくなることがあるので、ライブラリのバージョンをあげるときは気を付ける。もし、あげてしまってトラブルになった時は、一度、アンインストールした後、再度、バージョンを1つか2つ古いバージョンに指定してインストールする。

例)numpyのバージョンをあげたら、pymatgenでエラーがでた。

 

 

赤丸のところにチェックを入れると、バージョンを指定できるようになる。

 

t-sneの例

 参考リンクに載っていたt-sneのコードを使って実際に動かしてみた。

 

#ライブラリの読み込み
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
from gensim.models import word2vec

#モデルの読み出し
model = word2vec.Word2Vec.load('MODEL.model')

#x軸の決定
X = model[model.wv.vocab]

#次元圧縮の定義
tsne = TSNE(n_components=2)

#次元圧縮後のx軸の決定
X_tsne = tsne.fit_transform(X[:1000,:])

#図の作成
plt.scatter(X_tsne[:, 0], X_tsne[:, 1])
plt.show() 


参考リンク

word2vec:類似ベクトルの計算

類似ベクトルを表示する。

パターン1:計算モデルをロードし、キーワードを予め与える。
from gensim.models import word2vec

model = word2vec.Word2Vec.load('MODEL.model')
results = model.wv.most_similar(positive=['KEYWORD'], topn=10)
for result in results:
    print(result)


・topn=10はデフォルトなので、省略可能。(20個表示したければtopn=20と書く)

・wv.most_similarを使っている。 



パターン2: modelとキーワードは引数として与える。

from gensim.models import word2vec
import sys

model   = word2vec.Word2Vec.load(sys.argv[1])
results = model.most_similar(positive=sys.argv[2], topn=10)

for result in results:
    print(result[0], '\t', result[1])


・most_similarはmv.most_similarを使うように警告がでている。



word2vecの計算モデルの読み込み

word2vecの計算モデルの読み込み

 

from gensim.models import word2vec
from pprint import pprint

model = word2vec.Word2Vec.load('Keisan.model')
pprint(model.wv['keyword'])

word2vecの計算方法について

簡単なword2vecの計算方法

from gensim.models import word2vec

files = word2vec.LineSentence('data.txt')

model = word2vec.Word2Vec(files, size=200, min_count=10, window=10, sample=1e-3)
model.save("out.model")


注釈
データを読み込むときはword2vec.LineSentence、または
word2vec.Text8Corpusを使っているケースが多いが、とりあえず、LineSentenceを使っておけばよい。

Text8Corpusを使うのは以下の時。


    テキストと画像キャプションは保持
    テーブルや外国語バージョンへのリンクを除去
    引用、脚注、マークアップを除去
    ハイパーテキストはアンカーテキストだけ保持。それ以外は除去
    数字はつづりを変換。たとえば、"20"は"two zero"に変換
    大文字を小文字に変換
    a-zの範囲に入らない文字はスペースに変換


参考リンク

日本語版text8コーパスを作って分散表現を学習する

gensimのword2vecのためのオプション一覧

2020年11月9日月曜日

Pycharmでコマンドライン引数を使う方法

 ファイルを取り込んで計算したい場合、Pycharmではコマンドラインで引数を与えることができないので、 以下の手順でファイルを読み込む。

「実行」→「構成の編集」→「Pythonを選択して「+」をクリック」

構成が開いたら、

スクリプト・パス:スクリプトがあるところ。

パラメーター:ここに引数を入力する。(パスに気を付ける。フルパスで書いた方が良い。)

これで、「適用」、「OK」を押して、実行する。


赤丸のところがパラメーター、つまり引数を書くところ

 

 

 

 

参考リンク

2020年11月8日日曜日

機械学習結果における次元削減について役に立つサイト

 機械学習の結果を可視化するために必要な次元削減(Dimensionality Reduction)について説明したサイト

 

 30分でわかる機械学習用語「次元削減(Dimensionality Reduction)」

全体的な内容について、図も使っていて直感的に分かりやすい。

 

 sklearn.manifold.TSNE

PythonライブラリでのT-SNEの使い方について説明している。



 

 

t-sneの練習2

 t-SNEでDigitsを次元圧縮して可視化してみた

 8*8の手書きデータに対してt-sneを使って次元圧縮しているサイトがあったので、参考にしたやってみた。 

from sklearn.datasets import load_digits
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt

# データ準備
digits = load_digits()
X = digits.data
y = digits.target

# t-SNEの実行
tsne = TSNE(n_components=2)
X_tsne = tsne.fit_transform(X)

# 可視化
x_max, x_min = X_tsne[:, 0].max() * 1.05, X_tsne[:, 0].min() * 1.05
y_max, y_min = X_tsne[:, 1].max() * 1.05, X_tsne[:, 1].min() * 1.05
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(1, 1, 1, xlim=(x_min, x_max), ylim=(y_min, y_max))
ax.set_title("t-SNE")
for i, target in enumerate(y):
    ax.text(X_tsne[i, 0], X_tsne[i, 1], target)
plt.show()

 
 
 
参考リンク(sklearn.maniforld.TSNE) 
 


2020年11月5日木曜日

エンジンオイル交換(アウトバック)

 アウトバックのエンジンオイルのみを交換した。フィルターは交換せず。(\2500)。ODO:66614km

word2vec (pythonライブラリ編)

 pythonのライブラリを使って、word2vecを行う方法。

pip3 install gensim

pip3 install word2vec

でインストールする。

・機械学習のためのスクリプト

from gensim.models import word2vec
import logging
import sys

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

sentences = word2vec.LineSentence(sys.argv[1])
model = word2vec.Word2Vec(sentences,
                          sg=1,
                          size=100,
                          min_count=1,
                          window=10,
                          hs=1,
                          negative=0)
model.save(sys.argv[2])

これをtrain.pyと名付けて実行する。 (実行できなければ、chmod 755 train.pyで実行許可を与える。)

python3 train.py TEXT.txt TEXT.model

(python3でtrain.pyを実行し、TEXT.txtを機械学習する。その後、TEXT.modelとしてアウトプットする。)

計算が終わったら、以下のスクリプト(similars.py)で類似の高い語を抜き出してみる。

from gensim.models import word2vec
import sys

model   = word2vec.Word2Vec.load(sys.argv[1])
results = model.most_similar(positive=sys.argv[2], topn=10)

for result in results:
    print(result[0], '\t', result[1])


使い方

python3 similars.py TEXT.model AAA

(AAAは調べたい単語)


参考リンク:Pythonで「老人と海」をword2vecする



 

 

 

 

2020年11月4日水曜日

Windows Powershell

 Windows Powershell とPowershell ISEの違い

ISEは「Integrated Sripting Environment」の略。

スクリプト開発にはPowershell ISEを使い、対話モードなどでは、通常のPowershellを使うと良いらしい。

参考リンク

2020年11月3日火曜日

Python:ファイルへの書き込み

パターン1 
fout = open('sample.txt','w')
fout.write('123456')
fout.close()
ポイント
・最後に必ずclose()する。 
 
パターン2
with open ('sample2.txt', 'w') as f:
print('123456', file = f) 
ポイント
・printの行はインデント下げを行う。 
・最後のcloseは要らない。(f.close()をつけてもよい) 
 

 

indioのグリスアップ

ロックダジュールindioの前後輪グリスアップを行った。