CV・NLPハマりどころメモ

画像認識と自然言語処理を研究する上でうまくいかなかったことと,その対策をまとめる自分用のメモが中心.

pathlibを使うとglobもopenも使わずにテキスト処理ができる[Python]

これまで特定のフォルダ内にあるテキストファイルを処理するときは、以下のようにglobをインポートして、ファイルパスのリストを作成した後に、with openでテキストを読み込むということをしていた。

from glob import glob

src = "./input_txt/*.txt"

for txt in glob(src):
 with open(txt, "r") as f:
  f.read()

パス指定の時にアスタリスクが入ったり、with openによる無駄なfが発生したり、無駄なインシデントが発生したりし、コードが汚い。

一方、pathlibをインポートすると、以下のようにコードがすっきりする。

from pathlib import Path

src = "./input_txt/"

for txt in Path(src).glob("*.txt"):
 t = txt.open("r").read()

ちなみに、pathlibのglobで読み込むと、ファイルリストがリストではなく、イテレーターで返ってくるのでメモリのパンクが防止できる。この点もGood.

Raspi 3B+に外付けHDDをつなげてNextCloudでファイルサーバーを作成[NextCloud]

まずは下記のサイトを参考にRaspiにUbuntu server 18を導入した.

gihyo.jp

次に下記のブログを参考に外付けHDDをRaspiにマウント

マウントは/mediaディレクトリにすること.

qiita.com

ここからNext Cloudのインストールに移る.

snapのインストール

sudo apt-get install snapd

NextCloudのインストール

sudo snap install nextcloud

/mediaディレクトリへ接続

以下のコマンドが重要. NextCloudに/mediaディレクトリを認識させるのだ.外付けHDDのマウントは,/mediaディレクトリにしていることが前提. 多くのエラーは/mediaディレクトリに接続を行っていないことが原因で起こる.

sudo snap connect nextcloud:removable-media

.ocdataを作成

マウントした外付けHDDのディレクトリを仮に/media/hddとする. このとき,

sudo touch /media/hdd/.ocdata

を入力することで.ocdataを作成

権限を770に変更

マウントした外付けHDDのパーミッションを770に変更する.

sudo chmod 770 /media/hdd

config.php の編集

外付けHDDのディレクトリをコンフィグファイルに書き込む.

sudo vim /var/snap/nextcloud/current/nextcloud/config/config.php

config.phpdatadirectoryをマウントしたHDDのディレクトリにすることで,データディレクトリを変更.

'datadirectory' => '/media/hdd'

設定を反映

以下のコマンドでこれまでの変更を反映させる.

sudo snap restart nextcloud.php-fpm

一旦再起動

sudo reboot

NextCloudにブラウザでアクセスし初期設定

http://[NextCloudのIP] にブラウザへアクセスし,ユーザとパスワードを作成する.

確認

画面右上の設定の歯車マークを押し,左のメニューからモニタリングを選択. その中のストレージの項目の空き容量を確認することで,外付けHDDがデータディレクトリとなっていることを確認できる.

2枚のプロットを連続して出力する方法[Matplotlib]

plt.scatter(transformed_pca[:,0], transformed_pca[:,1])
plt.xlim(-0.1,1.1)
plt.ylim(-0.1,1.1)
plt.savefig('./pca.png')
    
plt.figure(2)
    
plt.scatter(transformed_tsne[:,0], transformed_tsne[:,1])
plt.xlim(-0.1,1.1)
plt.ylim(-0.1,1.1)
plt.savefig('./tsne.png')

plt.figure(1)にすると,1枚目に2枚目のデータがかぶさる. なので,1枚目と2枚目はそれぞれ独立に出力して,3枚目に両方のデータをプロットすることもできる.

plt.scatter(transformed_pca[:,0], transformed_pca[:,1])
plt.xlim(-0.1,1.1)
plt.ylim(-0.1,1.1)
plt.savefig('./pca.png')
    
plt.figure(2)
    
plt.scatter(transformed_tsne[:,0], transformed_tsne[:,1])
plt.xlim(-0.1,1.1)
plt.ylim(-0.1,1.1)
plt.savefig('./tsne.png')

plt.figure(3)

plt.scatter(transformed_pca[:,0], transformed_pca[:,1])
plt.scatter(transformed_tsne[:,0], transformed_tsne[:,1])
plt.xlim(-0.1,1.1)
plt.ylim(-0.1,1.1)
plt.savefig('./pca_and_tsne.png')

Flairで自前のELMoモデルを読み込む方法[Flair]

    from flair.embeddings import ELMoEmbeddings
    from flair.data import Sentence

    sentence = Sentence(phrase)
    
    # Preparating ELMo
    options = './elmo_options.json'
    weights = './elmo_weights.hdf5'
    
    embedding = ELMoEmbeddings('custom', options_file = options, weight_file = weights)
    
    embedding.embed(sentence)

Skype会議の招待はHTML形式でないとリンクが取れない[Skype]

Outlook

f:id:Vastee:20200109095041p:plain

のボタンを押すと,簡単にSkype会議を設定できるのだが, デフォルト設定のテキスト形式でメールを送ると,以下のように文字化けしてしまう.

f:id:Vastee:20200109095208p:plain

こういうときは,ファイル > オプション. > メール でHTML形式に切り替えてみよう.

f:id:Vastee:20200109095355p:plain

HTML形式にすると,問題無く会議室へのリンクが送れる.

f:id:Vastee:20200109095505p:plain