かっくんの学習記録

エンジニアの卵が綴る学習の記録です。何かの参考になれば嬉しいです。

Vim 設定編

Vimの設定

 Vimの設定は、.vimrcに記述していきます。

設定ファイルの位置確認

 .vimrcの位置を確認するには、下記のコマンドをターミナル上で入力してください。筆者はzshを使っているため、コマンドの前には”%”がついています。そのため、読者がコマンドを入力する場合には、”%”以降を入力してください。

% vim --version

 上記のコマンドを入力することで、下記の情報が出力されてます。

  system vimrc file: "$VIM/vimrc"
       user vimrc file: "$HOME/.vimrc"
2nd user vimrc file: "~/.vim/vimrc"
         user exrc file: "$HOME/.exrc"
 fall-back for $VIM: "/usr/share/vim"

   設定を記述するべきファイルがあるPATHは、”user vimrc:”の後に表示されています。また”$HOME”は、”~”に置き換えることができます。

基本的な設定

 ここでは、最低限必要だと考えられる設定について説明します。

set number
set title
set tabstop=4
set expandtab
set shiftwidth=4
set smartindent
set virtualedit=block
set whichwrap=b,s,[,],<,>
set cursoline

 上記の設定について、簡単に説明します。

項目 説明
number 行番号を表示する。
title ターミナルのタイトルにファイルの名前とPATHを表示する。
tabstop=4 Tabの幅をスペース4つ分にする。
expandtab Tabを半角スペースで挿入する。
shiftwidth=4 Vimが自動で生成するTabの幅をスペース4つ分にする。
smartindent 改行する時などに、自動でインデントを設定する。
virtualedit=block 文字のないところにカーソルで移動できるようにする。
whichwrap=b,s,[,],<,> カーソルの回り込みをできるようにする。
cursoline カーソルが行に下線を表示する。

Vim 入門編

Vimとは

 Vimはコンソール上でテキストエディタです。

Vimのモード説明

 Vimには、下記のモードが存在します。

モード名 説明
ノーマルモード ・カーソルの移動
・他のモードへの移行
・テキストのコピー,カット,ペースト
挿入モード ・テキストの入力,編集
コマンドラインモード Vimエディタコマンドの実行
・ファイルの保存
・テキストの置換
ビジュアルモード ・テキストの選択

 基本はノーマルモードです。各モードからEscキーでノーマルモードに戻ることができます。  その他のモードへ移行する場合には、下記のキーを入力します。

モード名 移行キー
挿入モード a:入力モード
i:挿入モード
コマンドラインモード /
ビジュアルモード v

カーソル移動

 Vimはノーマルモードの時に、下記のキーによって任意の方向にカーソルを移動することができます。

キー 移動方向
h
j
k
l
0 行頭へ移動
$ 行末へ移動

Vimエディタコマンド

 Vimエディタによって記述した内容や変更した内容を保存したり、Vimエディタを閉じたりする場合には、下記のコマンドを入力します。

コマンド 機能
:w 編集内容を保存
:q 未編集の状態でファイルを閉じる
:wq 編集内容を保存し、ファイルを閉じる
:q! 編集した内容も破棄して、強制的にファイルを閉じる

よく使うコマンド

 ここでは実際によく使う便利なコマンドを紹介します。

コマンド 機能
dd 一行全てを削除

zsh(チュートリアル)

zshの利点

 zshの特徴は、下記の通りです。

  • bashの主な機能を網羅
  • for i (*.c) echo $i のようなループの省略形をサポート
  • 拡張されたファイルグロブやリダイレクト
  • 履歴のインクリメンタルサーチ
  • 強力でプログラミング可能なコマンドライン補完機能
  • 複数のコマンド履歴を共有
  • 強力なファイル名展開
  • スペルミス修正機能
  • 拡張されたエイリアス

zshの基本

 zshの設定ファイル(.zshrc)に最低限の設定を記述しておきます。このファイルは、vim ~/.zshrcで作成・記述すれば大丈夫です。

autoload -U compinit
compinit
setopt auto_pushd
setopt auto_cd
setopt correct

 zshの起動

$ zsh
%

 シェルがbashの場合は、先頭に$マークが表示されています。そこでzshを実行すると、$マークから%マークになります。%マークはzshである印です。

 zshのバージョン確認は、下記のコマンドを実行すると確認できます。

% zsh --version

zshをログインシェルにする方法

 まず、whichコマンドでzshのパスを確認します。

$ which zsh
/bin/zsh

 次に、chshコマンドでログインシェルを変更します。Passwordは自分で設定したパスワードを入力してください。

$ chsh -s /bin/zsh
Password:

強力な補完機能

 一部のコマンドを入力してから、tabキーを押すと候補であるファイルやディレクトリなどを全て表示することができます。下記では、tabキーを押すタイミングをわかりやすくするために、(tab)で表しています。
 lsコマンドの場合は、以下のようになります。 

% ls (tab)
Desktop/  Applications/  Movie/  memo.txt

 また、cdコマンドの場合は、以下のようになります。

% cd (tab)
Desktop/  Applications/  Movie/

コマンドのスペルチェック

 コマンドを打ち間違えて実行してしまった場合でも、再入力する必要がありません。もしかして○○ですかと英語で聞かれるので、その後にyを打つだけで正しいコマンドが実行されます。

% hisotry
zsh: correct 'hisotry' to 'history' [nyae]?

cdコマンドの省略

 ディレクトリを移動する際に、cdコマンドを入力しなくても、ディレクトリを入力するだけで移動することができます。

% /usr/local/bin/
% pwd
/usr/local/bin

ディレクトリの移動履歴

 zshは過去に移動したディレクトリを記憶しているので、cd -に続けてtabキーを押すと候補の一覧が表示されます。

% cd -(tab)
0 -- ~/Desktop/Program
1 -- ~/Applications
2 -- /usr/local/bin
3 -- ~/Desktop

 その後は、移動したいディレクトリの番号を入力すると移動することができます。

% cd -3
~/Desktop

拡張ファイルグロブ

 ファイルグロブとは、「*.txt」「log.[1-5]」のように記述してファイル名のパターンマッチを行うことです。

●ファイルグロブの例1
 サブディレクトリ内を再帰的に探索し、memoファイルを探します。

% ls **/memo

●ファイルグロブの例2
 ls ファイル名<数字->では、ファイル名の後につく数字以上であるファイル名に一致して表示します。

% ls sample<25->
sample25  sample49  sample50

●ファイルグロブの例3
 ls *.(拡張子1|拡張子2)では、拡張子1と拡張子2のファイルを全て表示します。

% ls *.(py|c)
sample.py  demo.c  replace.py

●ファイルグロブの例4
 ls *(アクセス権限)では、アクセス権限と一致するファイルのみを表示します。

% ls *(R)
sample1.csv  sample4.csv

●ファイルグロブの例5
 ls *.拡張子1~ファイル名.拡張子1では、~(チルダ)以降のファイル名に一致するファイル以外で、拡張子1であるファイルを全て表示します。

% ls *.py~sample.py
replace.py  correct.py

複数行のヒストリ編集

 for文によるループをコマンドラインで使用することができます。「;(セミコロン)」で意図的に一行で記述しない限り、サブプロンプトに複数行でコマンドを入力します。

% for i in {0..4}
for> do
for> echo $i
for> done
0
1
2
3
4

リダイレクト

 あるコマンドの実行結果をfile1とfile2に保存したい場合は、下記のように記述すればできます。

% who > file1 > file2

 < ファイルでは、moreを使ってファイルが開かれます。下記の二つのコマンドは同じ意味です。

% < datafile
% more datafile

 > ファイルでは、標準入力からファイルへの書き込み(上書き)を行うことができます。下記の二つのコマンドは同じ意味です。

% > datafile
% cat > datafile

 ファイルに上書きではなく追記したい場合は、>ではなく>>を使います。

% >> datafile
% cat >> datafile

参考文献

[1]中島 能和 著、「zsh 最強シェル入門」、株式会社 翔泳社、2008年12月3日

自然言語処理の基本と技術(1)

1章 自然言語処理の概要

自然言語処理とは

 自然言語は、日常書いたり話したりしている日本語や英語などの言語です。そして、自然言語処理とは、自然言語を処理する技術や学術分野の総称です。

 上記の2つは、コンピュータ言語や形式言語などと総称され、自然言語と区別される。

 自然言語とコンピュータ言語や形式言語との最も大きな違いは、その曖昧性です。ここでいう曖昧性とは、文の構造や意味の解釈が複数考えられること、つまり一つの意味にはっきりと決まらないことを指しています。

自然言語処理の応用例と利用技術

日本語入力

 日本語入力ソフトは、最も身近で馴染み深い自然言語処理の応用例です。これに用いられている自然言語処理技術は、かな漢字変換です。
 かな漢字変換では、仮名で入力された単語や文を受け取り、それを適切なかな漢字交じりの単語や文に変換するというタスクを実行します。
 日本語入力ソフトには、Windows標準付属のMS-IMEMac OS標準付属のJapaneseIMのほか、ATOKGoogle日本語入力があります。

機械翻訳

 日本語入力と同様に、機械翻訳は身近な自然言語処理の応用例です。
 機械翻訳とは、「ある言語の文章を受け取り、それを別の言語の文章に自動的に翻訳する」処理です。特に、入力と出力が音声の場合は、音声翻訳と言います。
 現在では、機械翻訳の多くが、外国語で書かれた文章を自分の理解できる言語へと翻訳し、その大意を確認する(ジスティング:gisting)ためによく使われています。
 また人手による業務翻訳の分野では、機械翻訳が下訳作業に利用されるほか、自然言語処理の技術が翻訳支援に活用されています。例えば、翻訳メモリと呼ばれる仕組みでは、翻訳者が過去に翻訳した文章を対訳としてデータベースに保存しておくことで、翻訳者の負荷を削減しています。

検索エンジン

 日常生活に欠かせない検索するためのツールに、検索エンジンがあります。GoogleMicrosoft Bing、Yahoo!といったWeb検索エンジン以外にも、図書館の蔵書検索、ショッピングサイトの商品検索、レストラン検索などあらゆる場面で活用されています。
 クエリ検索要求とも呼ばれるキーワード)を入力し、クエリに適合するモノをデータベースから取り出す検索は、大量の情報を処理する上で最も基本的な技術です。検索の結果、取り出されるモノは文書と呼ばれます。

 Web検索エンジンは、下記の多くの問題があります。これらの問題は、自然言語処理の技術を使うことで解決できます。

  • 機械的に生成されたページ、重複ページ、スパムページの存在
  • 文書をどのように並び替えて、検索のトップページに持ってくるか

 また、検索エンジンには、スペル訂正(「もしかして〜」)や、クエリ提示(サジェスチョン)、検索結果の工夫など、「文書を検索する」基本機能以外にも様々な付加機能が追加されています。 

対話システム

 自然言語を用いたロボットとの対話は、自然言語処理の大きな目標の一つです。これを実現しようとするシステムは対話システムと呼ばれています。
 例えば、Apple社のSiriや、NTTドコモ社のしゃべってコンシェルなど、検索以外の様々なタスクをサポートする、いわゆるコンシェルジュシステムが普及しています。

 対話システムにおける処理の流れは、下記の通りです。

  1. 音声の入力
  2. 音声認識
  3. 形態素解析構文解析
  4. 意味解析
  5. 対話処理
  6. 応答生成
  7. 音声合成
  8. 音声の出力

質問応答

 質問応答システムとは一般に、特定の情報に関する自然言語で書かれた質問に対して、その回答を返すコンピュータシステムのことである。
 例えば、Apple社のSiriも、質問応答システムの一種である。回答の種類にはファクトイド型質問応答非ファクトイド型質問応答がある。

  • ファクトイド型質問応答:「誰、何、どこ」などの単純な固有名詞などを答えられるもの
  • 非ファクトイド型質問応答:「どうやって」「なぜ」などの単純な名詞などで答えることができないもの

 質問応答システムは、回答のための知識源として大量の文章からなるデータベースをバックエンドに保持している。一般に、下記のステップを通して回答する。

  1. 質問解析
  2. 情報検索
  3. 情報抽出
  4. 回答選択

日本における自然言語処理の発展過程

用例ベース翻訳システム

 用例ベース翻訳システムでは、数多くの例文と翻訳をデータベースとして集めておく。そして、新規の文を翻訳する際には、データベース中の類似した文や部分的な構造を組み合わせることで訳文を生成する。
 これは、前述の翻訳メモリと非常に類似した考え方である。
●メリット - 正しい訳文を追加することで翻訳の質を向上させることができる ●デメリット - 大量な記憶容量を必要とする - 例文の検索を工夫しなければいけない

日本語形態素解析

 日本語形態素解析とは、日本語の文を単語に分割し、品詞や活用などの解析をするシステムである。
1. 初期の形態素解析システム:JUMAN ⇨人手により作られた辞書や規則をベースに開発された 2. 形態素解析器:ChaSen ⇨人手によらず統計的な手法により、自動的にコスト推定する 3. 日本語の係り受け解析器:KNP 4. 日本語形態素解析エンジン:MeCabCRF(条件付き確率場)によってコスト推定をする汎用テキスト処理エンジン ⇨汎用性の高さと解析速度の速さ、高い解析精度が特徴

統計的手法・機械学習の発展

 確率・統計モデルを用いた統計的自然言語処理は、下記の二つの要因から可能になった。
- ウェブの発展で扱う言語データが膨大な量になったこと - コンピュータの記憶容量や性能が向上したこと

 また、SVM(サポートベクターマシン)やCRFなど、主要な機械学習アルゴリズムを実装したライブラリやツールが手軽に利用できるようになった。
 機械翻訳においても、原言語とその翻訳の目的言語の対訳文書からなるコーパスから、対訳辞書翻訳規則を統計的に抽出し、新たな入力の翻訳に用いる統計的機械翻訳**のアプローチが発展した。

自然言語処理の関連分野

人工知能言語学テキストマイニング

人工知能
 コンピュータを用いて、人間のような知能を実現することに関する学問である。

言語学
 人間の言語そのもの、もしくはそれに付随する仕組みを明らかにする学問である。

計算言語(Computational Linguistics)
 統計や論理など計算的手法を利用して自然言語モデリングする言語学の一分野である。

テキストマイニング
 確率・統計的な手法を用いて大量のテキストから有用な情報を引き出す技術の総称である。言語自体の処理よりも「役に立つ情報を引き出すこと」に重点が置かれた分野である。

 例えば、企業が収集したレビューを形態素解析し、そこに含まれる単語から、肯定的・否定的な意見を抽出・分類する評判分析がある。

統計学機械学習

機械学習
 実際のデータを参照し、傾向や規則などを自動的に抽出することにより、コンピュータのアルゴリズムを構築・改善する技術の総称である。人間の学習能力をコンピュータを用いて実現する技術である機械学習は、人工知能の一分野である。
 規則や基準などを明示的にプログラムすることなく、入力から出力を予測するアルゴリズムなどが作成可能である。

統計学
 データの数値的な傾向や特徴を取り扱う学問である。

音声認識音声合成

音声認識:  人間の話す言語(音声言語)をコンピュータによって解析し、文字や文章などに変換する技術である。
 携帯デバイスに搭載されたSiriGoogle Voice Search、人的コスト削減に向けた企業のコールセンターの自動応答システムなど、用途が広がっている。

 音声認識システムでは、一般的に二つのモデルから構成されている。 - 音響モデル:どのような音素がどのような音(周波数成分)と対応しているかを規定する - 言語モデル:どのような音素の並びが言語として自然かを規定する

音声合成:  文字や文章などの書かれた言葉(テキスト)を音声に変換する技術である。
 テキストを音声に変換することから、テキスト読み上げシステムと呼ばれることもある。

自然言語処理に関するキーワード

参考書籍

  • 「言語処理のための機械学習入門」(高村 大智 著、奥村 学 監修)⇨キーワード1~3
  • 「言語と計算(4)確率的言語モデル」(北 研二、辻井 潤一 著)⇨キーワード4~8
  • 「日本語入力を支える技術」(徳永 拓之 著)⇨キーワード11~13
  • 機械翻訳」(渡辺 太郎、今村 賢治、賀沢 秀人、Graham Neubig、中澤 敏明 著、奥村 学 監修)⇨キーワード14

参考文献

[1]小町 守、奥野 陽、グラム・ニュービック、萩原正人、「自然言語処理の基本と技術」(第1章)、株式会社翔泳社、2016年3月4日

macOS Sierraにアップデートしてからの不具合

Mac OSを「Yosemite」から「Sierra」にアップデートしたことによる不具合のまとめ

現在の環境

現段階で判明している不具合

  • homebrewが実行できない
  • vagrantのが実行できない

対応策

①homebrewについて

 再インストールをしました。

 このURL(https://brew.sh/index_ja.html)にアクセスします。以下のコマンドをiTerm2で実行しました。

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

 その後、下記のコマンドを実行しました。

brew install wget

 ですが、

zsh: command not found: brew

と言われてしまいました。

 そこで、xcodeのアップデートを行い、Command Line Tools for Xcode をインストールしました。

xcode-select --install

 再度、Homebrewのインストールを試みて、実行しましたができませんでした。

 その後、Homebrewのインストールのログをよく確認すると、Warningとなっている部分があることを発見しました。その内容は、/usr/local/binにPATHが通っていないというものでした。そのため、下記のコマンドを.zshrcに追記しました。

export PATH=/usr/local/bin:$PATH

 その後、追記したことを反映させるために、iTerm2で下記のコマンドを実行します。

source .zshrc

 そして、brewを確認してみると実行できるようになっていました。

vagrantについて  homebrewと同様に、PATHの問題であることがわかりました。

結論

 OSのアップデートを行った際には、PATHが通っているかをきちんと確認することが必要であることがわかりました。

追記

これは自分自身が今後のために記録したものです。

アドバイスやコメント等があれば、よろしくお願い致します。