白猫のメモ帳

C#とかJavaとかJavaScriptとかHTMLとか機械学習とか。

fastTextをインストールしてみる

こんばんは。

寒さに負けて早くもムートンブーツを出してしまったのですが、
もっと寒くなったらどんな格好をすれば良いのでしょうか。

さて、今日はFacebookの公開している自然言語処理ライブラリ「fastText」を使ってみたいので、
その環境構築をしてみます。

インストールするぞ

とりあえず調べたらコマンドライン実行のための構築手順と、
pythonライブラリのための構築手順がごっちゃになってヒットしたのでしょっぱなから混乱します。
どどどういうことなの・・・私はpythonは書けないのでコマンド実行が良いのですが・・・。

ググる

とりあえず、わかったことはWindows環境よりもLinux環境の方が良さそうということ。
というわけで、MacOSにDockerコンテナを立てて試してみることにします。
こういう時にDockerはミスったらやり直しができるので便利ですね。

というわけで余談ですが、珍しくMacで記事も書いているのでなんだかわたわたします。

とりあえずDockerコンテナを立てよう

Dockerのインストールは良い・・・ですよね?

Docker For Mac | Dockerから落としてきて、
言われた通りに操作すればあら簡単という感じですぐにインストールできます。
Bash On Windows(名前変わるんでしたっけ?)でも同じようなもんだと思います。試してないけど。

まずはイメージの確認。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

当然何もありません。
じゃあまずは空っぽのCentOSのイメージを探して来て・・・とか思いますが、
Dockerさんはrunする時にイメージがなければちゃんと取って来てくれる賢い子なので気にしないことにします。

$ docker run -it --name fasttext centos
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
85432449fd0f: Pull complete 
Digest: sha256:3b1a65e9a05f0a77b5e8a698d3359459904c2a354dc3b25ae2e2f5c95f0b3667
Status: Downloaded newer image for centos:latest
[root@596e34b5ca1f /]# 

素晴らしく簡単。-itオプションは起動したコンテナにそのままアタッチする呪文です。
あ、そうでした。Dockerがメインじゃないんでした。

Let's 環境構築

プレーンなCentOSコンテナでコマンド実行用のfastTextを使うのに必要なのは以下。

これらをyumで取って来ます。

# yum install -y git make gcc gcc-c++
(なんかいっぱい出る)

あ、コンテナ内は「#」つけますね。

で、cloneしてmake。
コンテナ内だからルートで良いやという適当さ。

# git clone https://github.com/facebookresearch/fastText.git
(なんかちょっと出る)
# cd fastText
# make
(なんかちょっと出る)

これだけでおしまい。簡単。
一応インストールできているかちょっと確認。

# ./fasttext     
usage: fasttext <command> <args>

The commands supported by fasttext are:

  supervised              train a supervised classifier
  quantize                quantize a model to reduce the memory usage
  test                    evaluate a supervised classifier
  predict                 predict most likely labels
  predict-prob            predict most likely labels with probabilities
  skipgram                train a skipgram model
  cbow                    train a cbow model
  print-word-vectors      print word vectors given a trained model
  print-sentence-vectors  print sentence vectors given a trained model
  print-ngrams            print ngrams given a trained model and word
  nn                      query for nearest neighbors
  analogies               query for analogies

大丈夫そうですね。

最小構成がわかるまでに余計なものを色々インストールしてコンテナ作りなおしたのは秘密。

今回はこれでおしまい。
次回はfastTextを使ってみます。

プロパティとかインデクサはインクリメントできる

こんにちは。

気温の変化についていけない私です。
今日はC#ネタ。

C#にはプロパティという便利な機能があります。
Javaばっかり書いていた私としては単なるアクセサの便利な書き方くらいに思っていたのですが、
ふと違いに気づいたのでメモ。

たとえばこんなint型のプロパティを持つクラスを作って、

class Test
{
    internal int Cnt { get; set; }
}

こんな風にインクリメントするとちゃんと演算してくれます。

var test = new Test();
Console.WriteLine(test.Cnt);
test.Cnt++;
Console.WriteLine(test.Cnt);

0
1

おお賢い。
ということはきっとインデクサもこんな風にすれば、

class Test
{
    private int[] ary = new int[1];
    internal int this[int i]
    {
        get => ary[i];
        set => ary[i] = value;
    }
}

インクリメントできる!

var test = new Test();
Console.WriteLine(test[0]);
test[0]++;
Console.WriteLine(test[0]);

0
1

単なるgetterだと考えるとこんなことはできません。
(intは参照型じゃないので)

これはインクリメント演算子がちゃんとgetterで取って、setterで入れているからなんでしょう。
ということはですよ、こんないたずらをすれば・・・

private int cnt;
internal int Cnt
{
    get => cnt;
    set => cnt = value + 1;
}

インクリメントしただけなのに、

var test = new Test();
Console.WriteLine(test.Cnt);
test.Cnt++;
Console.WriteLine(test.Cnt);

0
2

2増えた!

なるほど。楽しい。
よいこは真似しないようにしましょう。

closestメソッドは自身を含むよ

こんばんは。

ずいぶん久しぶりになってしまいました。
台風が近づく三連休初日、いかがお過ごしでしょうか。

さて、もうタイトルがすべてっていえばそれまでなのですが、
久しぶりにまじめにJavaScript(jQuery)を書いたら罠にはまったのでメモ。

.closest()ってどんなメソッド

.closest() | jQuery API Documentation

リンク先に

For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.

とあるように、DOMツリー内の祖先をトラバース、
つまり自身の要素をもとに外側に辿って行き、一番最初に見つかった要素を返すメソッドです。

<ul>
    <li id="item1">その1</li>
    <li id="item2">その2</li>
</ul>

というDOMに対して、

$("#item1").closest("ul");

と書くと直上のul要素を取得できます。
これは「.parent()」メソッドを使っても変わりません。

<ul>
    <li class="item"><a href="#">その1</a></li>
    <li class="item"><a href="#">その1</a>その2</li>
</ul>

というDOMに対して、

$("#item1 a").closest("ul");

としても、セレクタに一致するまで遡ってくれるのでul要素を取得できます。
parentを使っている場合よりも柔軟な構造変更が可能なわけです。

で、罠

DOMをもうちょっと複雑にしてみます。いわゆる入れ子構造。

<ul id="list1">
    <li id="item1">
        <ul id="item1-list1">
            <li id="item1-1">その1の1</li>
            <li id="item1-2">その1の1</li>
        </ul>
    </li>
    <li id="item2">その2</li>
</ul>

ディレクトリとか表現するときにはよくあるパターンですね。

$("#item1-1").closest("ul");

とすると当然直上のul、つまり#item1-list1を取得することができます。
されにその外側のulまで遡ろうとして、こう書くと、

$("#item1-1").closest("ul").closest("ul");

#list1が取れません
取れている要素を確認してみると#item1-list1になっています。

要するに先祖と言っている中には自分自身を含んでいるってことですね。

$("#item1-1").parents("ul").eq(1);

とかがいいのかな。もっといい方法あるのかな。

そんな罠に掛ったよっていうお話でしたとさ。