astamuse Lab

astamuse Labとは、アスタミューゼのエンジニアとデザイナーのブログです。アスタミューゼの事業・サービスを支えている知識と舞台裏の今を発信しています。

Linuxでディスクキャッシュとして使える「bcache」を試してみた

こんにちは。並河(@namikawa)です。

最近、すっかり暑くなってしまって、夏本番って感じですね。夏といえば、海に花火にラーメンと、楽しみが盛り沢山でワクワクしますね!

さて、弊社では多くのデータストアを持っておりますが、クラウドサービス上で大容量なディスクと高い性能を両立させようとすると、(費用的な意味での)コストが一気に跳ね上がることもあり、色々な工夫を試行錯誤しながらやっております。

一定量のホットデータがはっきり見えている前提であれば、高速なストレージデバイスをキャッシュとして使うことは定石であり、キャッシュと一括りにしても様々なレイヤで技術実装されています。

今回はその中でも比較的低レイヤとなるハードディスク等のディスクアレイのようなブロックデバイスに対するキャッシュとして動作する bcache について簡単な性能検証を行なってみました。

bcache とは

概要的な情報を以下に箇条書きします。

  • Linux kernel に組み込まれている
    • バージョン 3.10 以降で利用可能
  • 特定のデバイスを他のデバイスのキャッシュとして利用することが可能
    • 上位レイヤはキャッシュの存在を意識する必要がない (トランスペアレント)
  • write through / write back のサポート
  • 複数のデバイスを扱うことが可能
  • デフォルトではシーケンシャルI/Oアクセスのキャッシュをスキップ (変更可)
    • ハードディスクの苦手なランダムI/Oに絞ったキャッシュ
  • レイテンシをモニタリングし、キャッシュアクセスが輻輳する場合、バイパスさせることもできる (変更可)

尚、bcacheのようなキャッシュデバイスに関する類似的な実装としては、dm-cache、Flashcache、EnhanceIOなどが挙げられます。

インストール・設定

それでは、実際に使ってみましょう。

今回は、GCE上のUbuntu(16.04)のインスタンスを使ってみました。とはいっても、上述の通り、Linux kernelに組み込まれているので、基本的には bcache を扱うためのツールをインストールして、設定を行なっていく感じになります。

バッキングデバイスにハードディスク(/dev/sdb, 500GB)、キャッシュデバイスにSSD(/dev/sdc, 300GB)を利用しています。

ハードディスクとSSDの容量がアンバランスに見えますが、今回は性能的なベンチマークを行うため、あえてIOPSに一定の差がつくような環境にしています。

# apt-get install bcache-tools

まずは bcache を扱うためのツールを apt でインストールします。

# wipefs -a /dev/sdb1
# wipefs -a /dev/sdc1

必要に応じてパーティションを作成した後、FS等メタデータが残っている場合は、上記のように wipefs コマンドでクリアします。

# make-bcache -B /dev/sdb1 -C /dev/sdc1
UUID:           86758735-1c62-43b3-8673-641f148c0926
Set UUID:       499624a7-c90f-40c1-90da-0c2f33fec267
version:        0
nbuckets:       614398
block_size:     1
bucket_size:        1024
nr_in_set:      1
nr_this_dev:        0
first_bucket:       1
UUID:           bda52f6d-a658-4afa-b27d-8d004b210989
Set UUID:       499624a7-c90f-40c1-90da-0c2f33fec267
version:        1
block_size:     1
data_offset:        16

次に、上記のように make-bcache コマンドで、 "-B" オプションの後にバッキングデバイス、 "-C"オプションの後にキャッシュデバイスを指定すると、 bcache デバイス (/dev/bcacheN) が作成され、アタッチまで行なってくれます。

ここまで来ると、後は通常のデバイスブロックと同じように扱うことができます。

状況の確認等で、よく使う(気にする)ところとしては、

# cat /sys/block/bcache0/bcache/cache_mode
[writethrough] writeback writearound none

上記コマンドでキャッシュモードを確認したり、

# tail /sys/block/bcache0/bcache/stats_total/*
==> /sys/block/bcache0/bcache/stats_total/bypassed <==
21.3M

==> /sys/block/bcache0/bcache/stats_total/cache_bypass_hits <==
1

==> /sys/block/bcache0/bcache/stats_total/cache_bypass_misses <==
0

==> /sys/block/bcache0/bcache/stats_total/cache_hit_ratio <==
24

==> /sys/block/bcache0/bcache/stats_total/cache_hits <==
18

==> /sys/block/bcache0/bcache/stats_total/cache_miss_collisions <==
4

==> /sys/block/bcache0/bcache/stats_total/cache_misses <==
56

==> /sys/block/bcache0/bcache/stats_total/cache_readaheads <==
0

こんな感じで統計情報を確認できます。

ベンチマーク

せっかくなので、上記で作成した bcache デバイスに対して、ツールを使ってIOPS的なベンチマークを取得してみます。

前提条件は以下の通りです。

  • GCE で CPU 8core, メモリ 7.2GBのインスタンスを使用
  • バッキングデバイスにHDD(500GB)、キャッシュデバイスにSSD(300GB)を使用
  • OS は Ubuntu 16.04
  • ファイルシステムは XFS
  • ベンチマークツールは fio を使用
    • size=20G, bs=4k, ioengine=libaio, iodepth=8, direct=1

尚、ベンチマークに利用するデータを適切にキャッシュさせるために、意図的にシーケンシャルI/Oについてもキャッシュにのせるべく、以下の設定を行なっています。

# echo 0 > /sys/block/bcache0/bcache/sequential_cutoff



で、以下がベンチマークの結果となります。

f:id:astamuse:20170802121740p:plain

f:id:astamuse:20170802121748p:plain

表の1行目はハードディスク (500GB) 単体のベンチマーク結果、2行目は SSD (300GB) の結果、3行目は bcache デバイス (write through) の結果、4行目は bcache デバイス (write back) の結果となります。

この結果から、 bcache デバイスは、少なくともランダムI/Oアクセスにおいては、ピュアSSDの性能とまではいかないものの、キャッシュデバイスとして一定の効果をもたらしていることがわかります。

尚、 bcache については、ドキュメントを眺めている限り、様々な設定項目があるので、もう少しユースケースやデバイス・ファイルシステム等の特性を考慮したチューニングを行うことで、また違った数値結果となるかとは思います。

さらに検証したい項目

今回は時間の都合上、本当に試しに使って軽くベンチマークを取ってみました、的なところまでしか検証できていないのですが、今後は以下の項目について確認を進めたいと思っています。

  • GCE環境において、バッキングデバイスに SSD を、キャッシュデバイスに Local SSD を使用したベンチマーク
  • 耐障害性のテスト
  • キャッシュデバイスが急にダウンした際の振る舞い
  • キャッシュデバイスが急に性能低下またはエラーレートが高くなった時の振る舞い
  • キャッシュデバイスのオンラインでのアタッチやデタッチが使えるか

本題

・・・と、随分前置きが長くなりましたが、アスタミューゼでは、エンジニア・デザイナーを大募集中です。特に巨大な技術情報群のデータエンジニアリング基盤をバリバリ整備してみたい方や、巨大な技術情報群を扱ったWebサービスの開発をやってみたい方に関して、本当に明日からでも手伝っていただきたいと心から思っております。

少しでもご興味がある方は、下部バナーの採用サイトやサイドバーにある Wantedly のリンクから詳細をご確認いただいて、まずはオフィスに遊びに来ていただいて、カジュアルに情報交換できればと考えております。どうぞよろしくお願い致します。

家事・育児をエンジニアっぽくやってみる

こんにちは、nishikawaです。今日は家事・育児の話です。技術ブログなんだから技術のこと書けよ!とお叱りを受けそうですが、弊社には優秀な技術者である諸先輩方が多くいらっしゃいますので、技術的な記事はその方々にお任せしようと思います(笑)

今回は子育てをする上での課題をエンジニアをやっていて得た知識、考え方という観点を交えて記事を書かせていただきます。

子育てと仕事の両立は大変!

のっけから当たり前のことを言わせていただきますが、仕事と家事・育児を両立するのはとても大変です。理由は多々ありますが、大体は子供自体が不確定要素の塊であること、お世話に多くの時間が必要なこと、これに尽きるのではないかと思います。

以下が、私が1日の中で行っている活動に対する時間の割合です。

f:id:astamuse:20170725194216p:plain

この図から分かるように子供関連の時間と家事の時間を合わせると23%で1日のほんとんどは、「会社」「通勤」「家事・育児」となっていることが分かります。平日の自分の時間は皆無なので妻に関してはもっとだと思います。この状況は、社会で活躍しようとしている人からしてみれば人生の大きな壁の一つだと思います。

どんなに熱を出さないように気をつけていてもいきなり熱を出しますし、大人が予想もしていないような遊びをして部屋などを汚したり、物を壊したりすることも日常茶飯事です。これらに対して、仕事の予定を調整するというのがとても大変で個人の頑張りだけでは到底「両立」は不可能であると断言できます。

そもそも何がそんなに問題なのか?

子育てと仕事の両立に立ちふさがる第一の壁は「何が問題なのかを自他共に分かっていないこと」だと思います。そもそも大前提として、子育てをしながら仕事をする上で一番ネックになるのは子供の規則正しい生活を維持することです。決まった時間に起床または就寝をし、決まった時間にご飯を食べ、決まった時間にお昼寝をする。これだけのことですが、これを維持するのが大変でみんな悩んでいるわけです。例えば我が家の場合は息子に以下のタイミングでご飯や寝かしつけを行っています。

時間 イベント
6:00 起床
6:30 朝食
11:00 昼食
11:30〜14:00 お昼寝
15:00 おやつ
19:00 夕食
20:00 就寝

以上を踏まえた上で我が家で実際に起こった問題を書いてみました。

会社への予定調整に関する問題

  • 保育園に入れたはいいが子供の体調が安定せずに休みがちになる
  • 子供の予防接種や検診などで休まざるを得ない
  • 子供の登園は機嫌次第なので時間が読めない

私生活における問題

  • 保育園に行くための準備や保育園からの要望に対応するための時間を確保しなければならない
  • 家事の量が増え仕事以外は全て家事

対策

まず対策の前提として次のことが守られていることです。

  • 家事は夫婦二人で極力分担
  • 夫婦ともに自分の会社に現状を説明し理解してもらっている

会社への予定調整について

妻と予定を共有する

我が家ではまずお互いの予定を共有するところから始めました。使ったツールはGoogleカレンダーです。我が家では色んな理由から家族共通のGoogleアカウントを作りました。ここに予定を入れ、スマートフォンで確認するようにしています。

内容としては「リリースがあります」「打ち合わせがあります」ぐらいのレベルで簡単に外せない日を埋めていったり、子供の予防接種の予定なんかをあらかじめ入れるようにしました。このカレンダーをベースに子供に何かあった際にどちらが対応するかを話し合います。

保育園からの急な呼び出しについては、妻が時短勤務なのでほとんど任せっきりになっていますが、息子が体調不良で休む場合はこの方法でどちらが休むかを決めています。

登園時の息子の機嫌取りについて

息子の登園時の機嫌については、どうにも対処のしようがないので、シンプルに朝一で保育園に預けるようにしております。弊社はフレックスを採用しているため、コアタイムさえ守っていれば出社時間も退社時間も自由です。そのため不測の事態でどんなに遅れてもコアタイムのスタート時刻に間に合うように家を出ることでこの問題に対応しました。

家事について

さて、ここでようやっと今日の本題です。家事や子供関連の時間についての対策を記載します。

保育園の準備や保育園からの要望に対応するための時間が増加する問題について

保育園の準備についてはよく行う作業の簡略化保育園との対話で乗り切っております。

我が家で一番最初に取り組んだのは名前書きの部分です。名前書きは保育園から徹底するように言われているため、無数にあるおむつ一つ一つにすら名前を書かないといけないという状況が続いていました。

そこで以下の対応を取ることで、この問題を解決しています。

  • おむつやタオルなどのインクが染み込むものについてはお名前スタンプで対応する
  • その他のインクが染み込みづらいものはマスキングテープにお名前スタンプで名前をつけたものを貼っていく

これだけでトータル30分ぐらいの時短になりました。特にマスキングテープの効果は絶大で、剥がれづらい、洗濯してもOK、汚れに強いと、かなりおすすめです。我が家ではあらかじめ大量に作っておき何かあったらペタペタ貼っています。

また、保育園に対して無駄だと思うものはちゃんと抗議して検討し改善してもらうようにしました。(500枚ぐらいあるビニール袋全てに名前をかけとか、普段使いのエプロンとか色んなものを手作りしろとか)

家事の細分化

家事については、最近ポモドーロテクニックを使用し効率化を図っています。

ポモドーロテクニックとは

  • タスクを25分区切りで立てる
  • タスクを実行し終わったら5分間休憩を取る
  • タスクを4つこなすごとに15分〜30分の休憩を取る
  • 上記3つをくりかえす

というもので、開発者やデザイナー界隈で使用している人が多い手法です。この手法は人間の集中力を最大限に発揮するために、ノイズとなる電話対応や第三者からの問い合わせなどをできるだけ排除しタスクをこなしていきます。

この方法、家事の各タスクが集中すれば30分ぐらいで完遂できることや、短く時間を区切ることにより子供の要求に対応しやすいということで、いくつか改善の余地はあるものの、とても家事との相性がいいと運用してみて分かりました。

それで結果はどうだったのか?

これらの改善を行うことによりトータル1.5時間の時間短縮ができました。以下が改善後のグラフです。

f:id:astamuse:20170725194223p:plain

たった1.5時間ですが、この時間はとても大きく意義のある時間です。短縮できたこの時間はありがたく睡眠に当てさせていただいております(笑)。

まとめ

今回のことを受けて家事や子供に関係する時間は工夫次第でまだまだ改善できるのだなと思いました。1日は24時間しかないので、今回の成功に甘えずもっと突き詰められればと思います。

ただ、今回のことは何と言っても会社や周囲の理解があってこそなので、現状子育てがうまくいかないのは職場環境に問題がある可能性もあります。もし、少しでもそう思えるような節があるのであれば、毎度のことではありますが是非弊社の転職ナビシリーズをご活用頂ければと思います。

今回は電気制御/機械制御 転職ナビのリンクを貼っておきます。

https://electriccontrol-job.com/

また、こちらも毎度のことではありますが、弊社ではただいま技術者を募集しております。今回、記事にも書かせていただきましたが、弊社はフレックス制度を導入しているため、とても柔軟に仕事ができるようになっております。私だけでなく、諸先輩方にも仕事と子育てを両立している方は弊社には多くいますので興味がありましたら是非以下のリンクから弊社の採用ページをご覧いただければと思います。

http://recruit.astamuse.co.jp/

英文の自然言語処理におススメ!お手軽なPolyglotを使ってみた。

f:id:astamuse:20170719113042j:plain

こんにちは。白木(@YojiShiraki)です。デザイナーです。
今日はPythonで英文形態素解析をする上でお手軽便利なpolyglotについて紹介します。

背景

当社ではデータを分析・解析する機会がままありまして、こうしたときに自然言語解析の処理のツールを利用しています。特に最近では英語データが多く、このあたりのツールのニーズが高くなっています。

しかし、いざ英語の解析となると意外に情報がありません

例えば、日本語の解析ならMeCabChaSenKuromojiといったものはすぐ見つかります。しかし英文の自然言語解析ではTreeTaggerの情報は目につくもののイマイチまとまった情報がありません(このページこのページに他の選択肢がまとまっていますが)。

おそらくこの領域ではNLTKが王道なのかと思いますが、やや重厚感あります。

そこでもう少しライトなものをということでPolyglot*1をご案内します。

Polyglotとは?その特徴

Polyglotは様々な機能を持つPythonの自然言語解析モジュールです。対応している自然言語も幅広くインストールも非常に簡単です。サンプル実装のドキュメントも一通りそろっており、ちょっと真似すれば簡単に自然言語解析ができます。

まずはざっと特徴を見てみましょう(公式ままです)。

機能 機能(英語) 対応言語
分かち書き(トークン化) Tokenization 165 言語
言語判定 Language detection 196 言語
固有表現抽出 Named Entity Recognition 40 言語
品詞タグ付け Part of Speech Tagging 16 言語
センチメント分析・感情分析 Sentiment Analysis 136 言語
分散表現 Word Embeddings 137 言語
形態素解析 Morphological analysis 135 言語
翻字 Transliteration 69 言語

分かち書きの165言語対応もさることながら、言語判定196言語というのが凄まじいです。この辺りは後ほど一つずつ見ていきます。

またコマンドラインから直接叩けるのも魅力的です。例えば言語判定の機能をコマンドから呼ぶときは

polyglot detect --input testdata/cricket.txt

というコマンドによって、testdata/cricket.txtに記載されている言語の判定を行ってくれます。

ライセンス

PolyglotはGPLv3 licenseにて公開されています(2017年7月18日現在)。一般的なOSSのライセンスですね。商用利用可能です。

インストール方法

では早速インストールしてみましょう。 今回の開発環境は以下の通りです。

  • Ubuntu 14.04 @GCP
  • Python 3.4.3

なお、Polyglotは Python >=2.7 もしくは Python >=3.4. をサポートしています。

パッケージ・モジュールのインストール

ざっと以下のパッケージやモジュール等をインストールします。

公式ドキュメントにはnumpylibicu-devが必要とのことですが、それだけでは足りませんでした。経験的には以下のようにインストール進めれば問題ないと思います。

$ sudo apt-get update
$ sudo apt-get install libicu-dev
$ sudo apt-get install python3-pip
$ sudo -H pip3 install --upgrade pip
$ sudo -H pip3 install numpy
$ sudo -H pip3 install polyglot
$ sudo -H pip3 install pyicu
$ sudo -H pip3 install pycld2
$ sudo -H pip3 install morfessor

モデルのインストール

Polyglotは使う機能と対象とする自然言語に応じてモデルをダウンロードする必要があります。例えば英文に対して品詞抽出する場合は以下のようにembeddings2.enpos2.enをインストールします。

# 英語の品詞抽出用のモデルをDL
$ polyglot download embeddings2.en pos2.en

どの処理に対してどのモジュールをインストールすべきかは、エラーメッセージに書いてくれるのでそちらを参考にするのがよいです。例えば以下のようなエラーです。

ValueError: This resource is available in the index but not downloaded, yet. Try to run
polyglot download embeddings2.fr    # -> フランス語のモデルをダウンロードするように言われている

では引き続き個別の実装についてみていきます。

実装:言語判定

まずは言語判定からいきましょう。言語判定はモデルのダウロード不要です。インストールしたら即使えます。 ここでは試しにフランス語を判定させます。

# -*- coding:utf-8 -*-

from polyglot.detect import Detector

t = "Hé ! bonjour, Monsieur du Corbeau.Que vous êtes joli ! Que vous me semblez beau !"
detector = Detector(t)
print(detector)

結果はこちら。

Prediction is reliable: True
Language 1: name: French      code: fr       confidence:  98.0 read bytes:   811
Language 2: name: un          code: un       confidence:   0.0 read bytes:     0
Language 3: name: un          code: un       confidence:   0.0 read bytes:     0

フランス語が信頼度98.0で返ってきます。

特定の値だけ抽出したい場合は以下のように書きます。

print(detector.language.name)       # -> French
print(detector.language.code)       # -> fr
print(detector.language.confidence) # -> 98.0
print(detector.language.read_bytes) # -> 811

またdetecotr.languagesがイテレーターとなっているので

for lang in detector.languages:
    print(lang.name)

といった使い方もできます。

実装:分かち書き、品詞タグ付け

続いて分かち書きと品詞タグ付けです。先ほどのフランス語を対象にやってみます。 が、その前にフランス語を分かち書きするためにモデルをダウンロードします。

$ polyglot download embeddings2.fr pos2.fr

そのうえで、下記のコードを実行してみてください。

# -*- coding:utf-8 -*-

from polyglot.text import Text

t = "Hé ! bonjour, Monsieur du Corbeau.Que vous êtes joli ! Que vous me semblez beau !"
tokens = Text(t)
print(tokens.words)

結果としては

['Hé', '!', 'bonjour', ',', 'Monsieur', 'du', 'Corbeau.Que', 'vous', 'êtes', 'joli', '!', 'Que', 'vous', 'me', 'semblez', 'beau', '!']

が返ってきており分かち書きされていることが確認できます。 なお「なぜフランス語?」というツッコミは無しでお願いします(気づいたらそうなってただけです)。

引き続き品詞タグ付けします。

# -*- coding:utf-8 -*-

from polyglot.text import Text

t = "Hé ! bonjour, Monsieur du Corbeau.Que vous êtes joli ! Que vous me semblez beau !"
tokens = Text(t)
for token in tokens.pos_tags:
    print(token)

おそらくこのような結果が返ってきたかと思います。

('Hé', 'PROPN')
('!', 'PUNCT')
('bonjour', 'PROPN')
(',', 'PUNCT')
('Monsieur', 'PROPN')
('du', 'DET')
('Corbeau.Que', 'PUNCT')
('vous', 'PRON')
('êtes', 'VERB')
('joli', 'ADJ')
('!', 'PUNCT')
('Que', 'PRON')
('vous', 'PRON')
('me', 'PRON')
('semblez', 'VERB')
('beau', 'ADJ')
('!', 'PUNCT')

よさそうです。 単語と品詞を別々に取り出すにはこんな感じです。

# -*- coding:utf-8 -*-

from polyglot.text import Text

t = "Hé ! bonjour, Monsieur du Corbeau.Que vous êtes joli ! Que vous me semblez beau !"
tokens = Text(t)
for token in tokens.pos_tags:
    print("{0:20s}{1}".format(token[0], token[1]))

結果はこちら。

Hé                  PROPN
!                   PUNCT
bonjour             PROPN
,                   PUNCT
Monsieur            PROPN
du                  DET
Corbeau.Que         PUNCT
vous                PRON
êtes                VERB
joli                ADJ
!                   PUNCT
Que                 PRON
vous                PRON
me                  PRON
semblez             VERB
beau                ADJ
!                   PUNCT

ちなみに、分かち書きの際に言語判定も行っているのでこんな使い方もできます。

# -*- coding:utf-8 -*-

from polyglot.text import Text

t = "Hé ! bonjour, Monsieur du Corbeau.Que vous êtes joli ! Que vous me semblez beau !"
tokens = Text(t)
print(tokens.language)            # name: French   code: fr confidence:  98.0 read...
print(tokens.language.name)       # -> French
print(tokens.language.code)       # -> fr
print(tokens.language.confidence) # -> 98.0
print(tokens.language.read_bytes) # -> 811

実装:固有表現抽出

文章の中から固有表現の抽出を行います。これも実装は今までと大きく変わりません。 まずはモデルのダウンロード。今回は英文を対象に行うので英語用のモデルです。

$ polyglot download ner2.en

コードはこちら。文章はWikipediaの記事を一部利用しています(ref. New York)。

# -*- coding:utf-8 -*-

from polyglot.text import Text

t = ("New York is a state in the northeastern United States. "
     "New York is bordered by New Jersey and Pennsylvania to the south and Connecticut, Massachusetts, and Vermont to the east. "
     "The state has a maritime border in the Atlantic Ocean with Rhode Island, east of Long Island, "
     "as well as an international border with the Canadian provinces of Quebec to the north and Ontario to the northwest. "
     "New York was one of the original Thirteen Colonies that formed the United States. "
     "The state of New York, with an estimated 19.8 million residents in 2015,[9] is also referred to as New York State to distinguish it from New York City, "
     "the state's most populous city and its economic hub.")

tokens = Text(t)
for entity in tokens.entities:
    print(entity.tag, entity)

結果。

I-LOC ['York']
I-LOC ['United', 'States', '.', 'New', 'York']
I-LOC ['New', 'Jersey']
I-LOC ['Pennsylvania']
I-LOC ['Connecticut', ',', 'Massachusetts']
I-LOC ['Vermont']
I-LOC ['Rhode']
I-LOC ['Long']
I-LOC ['Canadian']
I-LOC ['Quebec']
I-LOC ['Ontario']
I-LOC ['.', 'New', 'York']
I-LOC ['United', 'States']
I-LOC ['New', 'York']
I-LOC ['New']
I-ORG ['New', 'York']
I-LOC ['New', 'York', 'State']
I-LOC ['New', 'York', 'City']

I-LOCと出ているのは場所の固有表現を表しています。ソースを見るとI-LOC以外にも組織を表すI-ORGや人物名を表すI-PERがあります。

その他

その他にも幾つか機能があります。特に面白いのは「センチメント分析・感情分析」と「分散表現」あたりですが、今回は時間の都合上割愛させてください(ソース読みきれませんでした・・)。後日、余力に応じて本稿に書き足します。

終わりに

いかがだったでしょうか、英文に限らず複数言語の自然言語に対応したPolyglot。

実は今回はgensimを使った英文のトピックモデルの実装(といってもコピペレベルですが)について書こうと思っていました。しかし英文自然言語解析の処理を書いてる時に「ライトで使いやすい自然言語解析ツール」の情報(日本語)が意外になく、「これ困っている人いるんじゃないか?」と思いテーマを変更したという経緯があります。

そういう意味では、この投稿をみて助かってくれる人が出てきたらいいな、と思います。そして英文の自然言語解析の世界が少しでも身近に感じてもらえれば嬉しいです。

なお、gensimからのLDAネタは今行っている実験うまくいったら書きます(フラグ)。

では、本日も最後までお読みいただきありがとうございました。

例によって当社では一緒に開発してくれるメンバーを募集しております。カジュアル面談も随時行っておりますので、「ちょっと話聞きたい」という方は、このブログのサイドバー下にあるアドレスか@YojiShirakiあたりにDMいただければと思います。

*1:Polyglotというと多言語プログラミング的なイメージが強いかもしれませんが、それとは別です。

Copyright © astamuse company, ltd. all rights reserved.