Bag of ML Words

ML = Machine Learning, Music Love, and Miscellaneous things in daily Livings

PDFのワードカウント (word counting of PDF files)

論文を英文添削に出す際など、word countで値段が決まる業者が多数あるのですが、

PDFってword countないんですよね。

かといってtexソースファイルはたくさんコマンドがあるので正しくカウントできないことは明白です。

 

じゃあどうするかなんですが、

PDFを.rtf (Rich Text Format)に吐き出してMicrosoft Wordでカウント!

これがたぶん現状の最良解です。

 

数式とかは壊れますし、真に正しい文字数にはならないと思いますが、

手でPDFテキストのコピペするよりは良いでしょう・・・

 

手順

  • 目的の論文PDFをAdobe Acrobatで開く(Adobe Readerでもできるかは不明)
  • 名前を付けて保存 --> その他のオプション --> リッチテキストフォーマットで保存
  • 生成されたRTFをMicrosoft Wordで開く
  • 画像の扱いとかが壊れすぎていないか確認
  • Microsoft Wordのワードカウント機能を利用する

 

別の手段:OCRソフトを使う

PDF、あるいは印刷したものをOCRソフトあるいはスキャナでOCRさせるという手段です。やったことはないです。

Oriol Vinyals, Quoc Le, "A Neural Conversational Model" (arXiv:1506.05869 [cs.CL]) ざっと読んでの(非専門家の)感想

一部で話題のこの論文、

[1506.05869] A Neural Conversational Model

ざっと読んでみました。

 

なお、私は対話モデリングの専門家じゃないので、

評価は大外ししている可能性があります。そのへんは自己責任で。

 

3行でまとめ

NIPS2014で提案された「任意長シーケンス入力から任意長シーケンス出力を行うseq2seq」を用いて、大規模な対話コーパスから「発話-->応答」の文対の写像を直接学習。人力で対話ルールや特徴量を作りこむことを(ほぼ)一切せずに、対話モデル学習を実現。

 

もう少し長いまとめ

前提

著者らは、NIPS2014で話題となった「任意長シーケンス入力から任意長シーケンス出力を行うDNN(seq2seq)」

Sutskever, Vinyals, and Le, "Sequence to Sequence Learning with Neural Networks", NIPS2014. 

の著者(の一部)です。同論文は、DNNで実現できていなかった「任意長シーケンスの入出力」を実現して、機械翻訳タスクで最高精度をたたき出しました。

で、Vinyalsさんは同モデルをparsing, image captionにも適用していて

この論文は対話に使ってみたということです。

 

背景と目的

対話モデリングは、自然言語処理やマンマシンインタラクションの中でもかなり難しいタスクになります*1。何の制約もない自由対話は本当に厳しいので、通常は対話のドメインを制約(たとえばQA、カスタマーサポートなど)したうえで、専門家の知見を活用した様々な構造や特徴などをその場その場で提案して少しでも自然な対話を実現しようとします。

 

この論文は、そういう試みをあきらめます。seq2seqモデルはかなり柔軟かつ複雑なシーケンス-->シーケンス写像を表現できるポテンシャルを持っています。そこで、対話のコンテキストなどの陽なモデル化はせず、「発話文-->応答文」の写像関係を大量の対話コーパスから直接学習、seq2seqモデルに学習させる、それだけです。

 

手法

対話って、Aさんの発話-->Bさんの発話-->Aさんの発話、というように、文-->応答文が延々続いていくものです。この論文では、その制御構造やパラメータとかは一切気にせず、ある発話から応答文を直接生成する複雑な非線形写像を、seq2seqと大量の対話コーパスから手に入れます。

実際、seq2seqをクロスエントロピー最大化で使うだけなので、論文中には一切式がありません。モデルの解説も半ページくらいで終わりで、あとは使ったコーパスと生成された対話例が載っているだけです。

 

ただし、このモデルは対話をtoo simplifyしていることを著者ら自身も認めています。実際、生成される対話もまだまだ自然とは言えないものです。それでも、例示される対話のいくつかは非常に自然に見えます。

これが対話モデリングの研究にとって、どのくらい「良い」発話なのか、これは専門家の方の意見を待たないといけませんが・・・。

 

実験結果

データセットは2つです。一つはIT trouble shootingコーパスです。一度の対話は大体400単語ぐらい。30Mトークン(発話対?論文からはトークンが何か明確には読み取れませんでした。)。

もう一つはOpen Subtitleコーパス*2です。こちらはドメインの閉じていないデータです。訓練用に62Mの発話文、テスト用に26Mの発話文を投入します。

 

定量評価ですが、どんな単語を選択(発話)するかをperplexityで評価しています。で、単純なn-gramモデルに比べてどちらのデータでもperplexityが下がっているそうです。

 

定性的な評価ですが、まずプロ研究者が作りこんださまざまな工夫をほぼ利用しないで、結構それっぽい対話を実現できているから素晴らしい、と言っています。

また、提案モデルはデータコーパス中にない質問に対しても汎化して、そこそこ妥当な回答をしていると主張しています。ただのテーブルルックアップじゃないよということです。

しかし、全然完璧じゃないということも認めています。まず、ちょっと言い回しを変えるとinconsistentな回答をしてくることがあるようです。

論文中の対話例7では

人間:what is your job?

マシン: i'm a lawyer. 

人間: what do you do?

マシン: I'm a doctor 

という例を挙げていて、対話の相手としての人格の安定性がない(作りこんでいないから)ことを示しています。

また、論文の大部分を占める対話例を読んでみると結構funnyなところも多いです。

IT troubleshootの対話例2だと

(事前に人間はlinuxを使っていると答えている)

マシン:is it a window machine?

マシン: we have linux on your machine. 

マシン: is it windos xp or windows 7?

人間: i am using linux

とか。マシンの応答、完全に混乱していますね

 

まとめ

結局、「対話モデリングの良さ」が定義できていないのは同じなので、どうあっても良い対話目指してまっすぐ学習することができない。したがって、これだけで「完ぺきな対話を実現するエージェント*3」モデルは作れないと思います。ですが、とにかくデータを突っ込むというDeepなアプローチを対話モデルの一つのbuilding blockとして使える可能性を示したところがエライと思いました。

 

*1:私は専門家ではないのですが、周囲に「対話の闇」の中で戦い続ける研究者の方が何人かいるので、難しいということは理解しています。

*2:Tiedemann, J. News from OPUS - A collection of multilingual
parallel corpora with tools and interfaces. In Nicolov,
N., Bontcheva, K., Angelova, G., and Mitkov, R.
(eds.), Recent Advances in Natural Language Processing,
volume V, pp. 237–248. John Benjamins, Amsterdam/
Philadelphia, Borovets, Bulgaria, 2009. ISBN 978
90 272 4825 1.

*3:SAOのユイちゃんとか、ツインシグナルのエモーションとか

ユニットテストについて(情報まとめるだけ)

記事のスペースで集めておくのも申し訳ない気がしますが。

 

職業プログラマではないので、テストを「強制」される機会がなくてなあなあにしていたのですが、どうもそうも言っていられないような感じがしてきた(気のせい)。

ということで、少し役立ちそうな記事をまとめておいて、後日の勉強の足がかりにします。

 

第6回 UnitTestをする理由 - テスト講座

ユニットテストを学ぶための推薦図書 | Knowledge Note | Developers AppKitBox

http://dev.classmethod.jp/testing/10_errors_about_unit_testing/

python: ソート(sort)

いつもソートのやり方で迷うので,まとめておくことにしましょう。

 

基本の挙動

リストでもndarrayでascendします。

>>> a = np.random.rand(10)
>>> a
array([ 0.32496596, 0.74999976, 0.77499606, 0.20691008, 0.307734 ,
0.72823673, 0.28689177, 0.40670341, 0.19758518, 0.85783996])
>>> b = [1, 2, 3, 4, 5, -5, -4, -3, -2, -1]
>>> a_sorted = np.sort(a)
>>> a_sorted
array([ 0.19758518, 0.20691008, 0.28689177, 0.307734 , 0.32496596,
0.40670341, 0.72823673, 0.74999976, 0.77499606, 0.85783996])
>>> a       # 非破壊
array([ 0.32496596, 0.74999976, 0.77499606, 0.20691008, 0.307734 ,
0.72823673, 0.28689177, 0.40670341, 0.19758518, 0.85783996])

>>> b.sort()
>>> b   # 破壊される
[-5, -4, -3, -2, -1, 1, 2, 3, 4, 5]

descendさせたいときはひっくり返す定番処理が必要です。reverseはやはり破壊的です。

>>> a_sorted_reverse = a[::-1]
>>> a_sorted_reverse
array([ 0.85783996,  0.19758518,  0.40670341,  0.28689177,  0.72823673,
        0.307734  ,  0.20691008,  0.77499606,  0.74999976,  0.32496596])
>>> c = b[::-1]
>>> c
[5, 4, 3, 2, 1, -1, -2, -3, -4, -5]
>>> b
[-5, -4, -3, -2, -1, 1, 2, 3, 4, 5]
>>> b.reverse()
>>> b
[5, 4, 3, 2, 1, -1, -2, -3, -4, -5]

インデックスをとる

インデックスが欲しいときにはnp.argsortですね。ただのリストのメソッドにはないのかなぁ?

>>> idx = np.argsort(a)
>>> idx
array([8, 3, 6, 4, 0, 7, 5, 1, 2, 9])
>>> e = a[idx]
>>> e
array([ 0.19758518, 0.20691008, 0.28689177, 0.307734 , 0.32496596,
0.40670341, 0.72823673, 0.74999976, 0.77499606, 0.85783996])

>>> b = [1, 2, 3, 4, 5, -5, -4, -3, -2, -1]
>>> idx2 = np.argsort(b)
>>> idx2
array([5, 6, 7, 8, 9, 0, 1, 2, 3, 4])

 

 

LaTeX: 図に対する文章の回り込み

普通に真ん中とかに図を置くのじゃなくて、絵の周りに文字が回り込むようにするには、wrapfigureを使えば良いよ。

 

lkj;lkj;lkj;lkじじょmどkめj;lkぽ

------------------  asdfkjlkjlkjlkdsjfoijl

----  figure -----   akjlkjlkjlkjljeiljfljhljkj

------------------  ぃじゃえk;おkふ

;kjぽjん;lkj;lkj;lkj;lkjl;kjlklkj

 

こんな感じ。

¥usepackage{wrapfig}

 

¥begin{wrapfigure}{position}{width}

¥includegraphics{hoge.eps}

¥caption

¥label

¥end{wrapfigure}

positionはl, rで図を紙面のどこに配置するか。

widthは回り込みを含めた図領域の幅です。

 

OpenCV python(anaconda)でインストール Ubuntu 14.04

(前のエントリの日本語バージョン)

Ubuntu14.04でOpenCV pythonラッパをインストールしました。

普通のpythonライブラリじゃなくてAnacondaを使ってるので、それようにオプションとか変えないといけないところで主にハマってました。 

参考となるページ

1. Installing OpenCV 2.2 in Ubuntu 11.04 – Sebastian Montabone

2. LIBTIFF_4.0 link errors - OpenCV Q&A Forum

 

やりかた 

準備

まずはOpenCVのインストールパッケージを手に入れます。今回はOpenCV-2.4.10を使いました。

unzipして、中にビルド用のディレクトリを切ります。作業はそこでします。 

unzip opencv-2.4.10.zip

cd opencv-2.4.10

mkdir build

cd build

つづいて、上記ref1. を参考に必要なライブラリをapt-getします。

ただ、その前に"libopencv*"をremoveしておいたほうが安全です。 

cmake

続いて、cmakeでmakefileを生成します。

私の場合は下記のオプションでインストールに成功しました。

 

cmake -D BUILD_EXAMPLES=ON -D CMAKE_BUILD_TYPE=RELEASE \ 

-D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_1394=OFF \ 

-D WITH_IPP=ON -D WITH_TBB=ON -D WITH_V4L=OFF \ 

-D PYTHON_EXECUTABLE=(anaconda dir path)/bin/python

-D PYTHON_LIBRARY=(anaconda dir path)/lib/libpython2.7.so \

-D PYTHON_INCLUDE=(anaconda dir path)/include/python2.7 \ 

-D PYTHON_PACKAGES_PATH=(anaconda dir path)/lib/python2.7/site-packages \ 

-D BUILD_TIFF=ON \ 

-D CMAKE_C_COMPILER=/usr/bin/gcc

-D CMAKE_CXX_COMPILER=/usr/bin/g++ ../

 

makeがうまくいかない場合はエラーメッセージを良くみて必要なライブラリなどを整備しましょう。 

make and make install

makeしてmake installします。makeはけっこう時間かかります。 

make

sudo make install

Test

まずはanaconda/bin/pythonを起動して、モジュールのimportをします。

import cv2

もしダメな場合はPYTHONPATHなどを確認しましょう。

 

続いて、実際にOpenCVの関数を使った簡単プログラムを書くべきです。これは私も経験したのですが、「make通ってモジュールimportできても、肝心のバイナリができていない」ことが結構あるからです。

 

GLIBC with libm.so.6で問題が出た場合は、/lib/x86_64-linux-gunu/libm.so.6 をanadonda/bin/../lib/にコピーするとうまくいくことが多いです。ただし、かならずバックアップをとってからやりましょう! 

Import Error: `GLIBC_2.15' not found - OpenCV Q&A Forum

 

おしまい.