かんちゃんの備忘録

プログラミングや言語処理、ゲームなど知的好奇心のための備忘録(個人の感想)です。

zshで引数に指定したファイルの絶対パスを取得

引数の相対パス絶対パスに展開する

「ls test.txt」みたいに相対パスで指定することは良くあるかと思います。
後から別ディレクトリで似た作業をやろうとして、過去ログを参考にするのですがパスが違うとよく分からないことがちらほら・・・
本当はログに絶対パスで残って欲しいのですが分からないので、実行時に一手間加えて絶対パスに展開します。

方法

至って単純です。
zshの機能を使います。

ls test.txt(:a)
と入力します。

(:a)
にカーソルを合わせて、TABを2,3回押下すると絶対パスへと展開されます。

おわりに

zshは便利なコマンドやショートカットが眠っています。
あまりにも膨大なので把握はできませんが、zshのマニュアルをたまに読んでみると新しい発見があります。
ぜひぜひ、快適なzshライフを!!

シェルスクリプトでスクリプトのパスを取得

シェルスクリプトスクリプト自身のパスを取得

シェルスクリプトを書くときに、cd シェルスクリプトがあるディレクトリというようにカレントディレクトリをスクリプト自身のパスに変更したいときがあります。
こうすることで、シェルスクリプト内ではそのシェルスクリプトを基準とした相対パスで処理を記述することができます。

やりかた

$(コマンド)もしくは`コマンド`(バッククォート)でコマンドを実行し、その標準出力を文字列として扱えます。
$0には実行したシェルスクリプトの名前が入ります。
#!/bin/sh

cd $(dirname $0)
コマンドは、実行するシェルスクリプトがあるディレクトリの位置を相対パスで取得し、そこに移動するという意味です。

Pythonの正規表現でカタカナやひらがなを引っかける

perlだとUnicodeプロパティで\p{Hiragana}とするところです。
しかし、PythonUnicodeプロパティをサポートしていない?ようですので、正規表現で獲得します。


前提

Unicodeが対象です。

ひらがなの獲得

reモジュールで正規表現コンパイルして、fullmatchで全一致かどうかを判定します。
\u3041は「ぁ」、\u3093は「ん」を表します。
# -*- coding: utf-8 -*-
import re

re_hiragana = re.compile(r'[\u3041-\u3093]')
print(re_hiragana.fullmatch('ひらがな'))
# Trueが返ってくる

カタカナの獲得

ひらがなと同様です。
\u30A1は「ァ」、\u30F4は「ヴ」を示します。
# -*- coding: utf-8 -*-
import re

re_katakana = re.compile(r'[\u30A1-\u30F4]+')
print(re_katakana.fullmatch('カタカナ'))
# Trueが返ってくる

Unicodeの確認

上記正規表現は、厳密に言うとすべてのカタカナやひらがなを満たしていません。
これらは使用用途に応じて、Unicode表を見る必要があります。
図書館員のコンピュータ基礎講座さんにUnicode表が、きれいにまとまっています。
閉鎖中ですが、まだサイトは当面維持されるようです。
- カタカナの表
- ひらがなの表

NaiveBayse、SVMによる文書分類を試す

NaiveBayesによる文書分類、SVMによる文書分類を試しました。




NaiveBayse, SVMによる文書分類

文書分類とは与えられた文書をあるカテゴリに分類することです。
例えば、ニュース記事がスポーツか政治社会かということを分類します。
ここではフリーで入手可能なコーパスを用いて、文書分類の代表的な手法であるNaiveBayseとSVMを使います。
文書分類に用いる素性は、文書中の名詞のTF・IDF値としました。
TF・IDFは単純に説明すると、様々な文書で使われる語の重みは小さく、一部の文書でのみ使う語の重みを大きくするような、語に対する重みです。
もう少し踏み込むと、TF(語の頻度)とIDF(出現する文書数の逆数)の積となります。
以上の素性を用いて、NaiveBayseおよびSVMで分類を行います。
NaiveBayseの理解のためにgihyo.jpの記事を写経して作ったものがここにあります。(今回利用した訳ではありません。)
SVMはパターン識別器を与えられた正解データから作成する機械学習器です。
詳細は割愛します(というよりも詳しくはっきりは理解できていません。)

ソースコード

一部、独自の単語分割器が使用されています。
MeCabを用いる際は、名詞の表層形を取り出します。
xmlの読み込みは適当にパースします。

結果

ナイーブベイズよりSVMのほうが4ポイントほど良い結果を示しました。

感想

Scikit-learnを用いると意図も簡単に文書分類を試すことができました。
手軽に実験するために、Scikit-learnを使いこなさねばと思いました。

機械翻訳尺度METEORについて

機械翻訳の自動評価尺度にはいろいろなものがあります。
代表的なBLEUを始め、RIBESやMETEORなどがあります。
評価尺度のうちの1つであるMETEORについて文献を軽く読みました。
その内容について、簡単にまとめたものです。

An Automatic Metric for MT Evaluation with Improved Correlation with Human Judgments

文献情報

Satanjeev Banerjee, Alon Lavie, METEOR: An Automatic Metric for MT Evaluation with Improved Correlation with Human Judgments, Proceedings of the Second
Workshop on Statistical Machine Translation, pp.228–231, 2007

概要

METEORという機械翻訳尺度の提案です。
参照訳と出力のユニグラムの合致数をもとにした評価尺度です。
ユニグラムの適合率と再現率および、どれくらい並びが参照訳と似ているかを計算します。
文単位の評価手法です。

なぜMETEORか?

人手評価から自動評価尺度BLEUへと変わったことにより、機械翻訳システムの評価が容易になりました。
しかし、1つの評価尺度だけで、機械翻訳の評価をするのは厳しいです。(それぞれの評価尺度が評価しやすい項目と苦手な項目があるためです。)
METEORは人手評価との相関が高くなるような評価手法です。
BLEUは再現率を直接考慮したものではないかわり、短い文に対してペナルティを加えています。
そこらへんを含めて、METEORは良い評価軸を求めます。

METEORとは?

BLEUの弱いところに勝つような自動評価尺度を目指します。
参照訳が複数ある場合は一番スコアの高い物を出力します。
ワードネットの同義語を使ったり、ステミングをしたもの(語形変化)を候補とすることもできます。
F値(適合率と再現率の調和平均)を用います。
単語単位で適合率および再現率を計算します。
なお、文献中では適合率1:再現率9となっています。

ペナルティを計算します。
正解の単語列が続かない場合にペナルティが大きくなります。

最終的なMETEORスコアはF値とペナルティを用いて、下記のように表されます。

評価

アラビア語-英語翻訳と中国語-英語翻訳で評価します。
人の評価との相関を確認します。
(精度や再現率はMETEORの一部です。)
評価尺度 相関
BLEU 0.817
NIST 0.892
適合率 0.752
再現率 0.941
F1 0.948
Fmean 0.952
METEOR 0.964
他の評価尺度よりいいですね。

今後

ペナルティをデータから決める必要があります。
現時点では、人手で良い感じのものを決め打ちです。
同義語以外の意味的な関連性を評価に落とし込みます。
いろいろな参照訳をうまく使う方法も考えないといけないです。

おわりに

METEORの日本語用類語辞書が無さそうなので、複数表現を考慮した日本語の評価は難しそうです。
日英翻訳では、システム評価に利用出来そうです。

NFS上での公開鍵認証を有効とする

SELinuxが有効になっているNFS環境のOSへの鍵認証に、公開鍵認証を有効とします。(nfsによるhomeディレクトリへのアクセスをSELinuxで許可する)
クライアントで以下のコマンドを実行します。
setsebool -P use_nfs_home_dirs 1
これで、sshの公開鍵認証がうまくいくはずです。

CentOS7(GTX1080)にディスプレイドライバのインストールとCUDAをインストール

GPGPU環境の構築を行います。
具体的には、GTX1080を搭載したCentOS7マシンにディスプレイドライバおよびCUDAをインストールします。

ディスプレイドライバのインストール

マニュアルを見ながらインストールします。

Nouveauドライバの無効化

nouveau(ヌーヴォー)はNVIDIAビデオカード用のフリードライバです。
これを無効化した後にインストールします。

イメージのコピー

mv /boot/initramfs-3.10.0-327.el7.x86_64.img /boot/initramfs-3.10.0-327.el7.x86_64-nouveau.img
dracut --omit-drivers nouveau /boot/initramfs-$(uname -r).img $(uname -r)

dracutはinitrdをカスタマイズするツール。

/etc/modprobe.d/modprobe.confを作成して、編集します。
もし、上記ファイルがない場合は、blacklist-nouveau.confなどを作ればいいかと思います。

blacklist nouveau
options nouveau modeset
=0

編集した後に、再起動します。

ランレベルを下げる

systemctl set-default multi-user.target

ドライバのインストール

GEFORCEのサイトからドライバをダウンロードします。
Manual Driver SearchでGeForce GTX 1080, Linux 64-bit, Japaneseを選び、検索します。
Linux x64(AMD64/EM64T) Display Driverをダウンロードします。

sh NVIDIA-Linux-x86_64-367.44.run

実行後にAcceptを押下。
32-bitライブラリをYes
nvidia-configがどうのこうのをYes

CUDAのインストール

CUDAをダウンロード

ダウンロードサイトからダウンロード
- Linux
- x86_64
- CentOS
- 7
- rpm(local)

インストール

公式ページにあるとおりに実行します。
結構時間がかかります。

rpm -i cuda-repo-rhel7-8-0-local-8.0.44-1.x86_64.rpm
yum clean all
yum install cuda

cudnnもインストールします。

tar zxvf cudnn-8.0-linux-x64-v5.1.tgz
cp cuda/include/cudnn.h /usr/local/cuda/include/
cp cuda/lib64/* /usr/local/cuda/lib64/

もう一度、ディスプレイドライバをインストール

なぜか、nvidia-smiなど使えないため、もう一度ディスプレイドライバをインストールします。
(手順を勘違いしているか、バグかのどちらかだと思います。)

sh NVIDIA-Linux-x86_64-367.44.run
  • Install DKMS kernel module
  • Install and overwrite existing

ランレベルを戻す

systemctl set-default graphical.target

再起動

shutdown -r now

参考にしたサイト

4