Colorful Wires

エンジニアリングの勉強の記録

classmethod と staticmethod の使い分け

static method は、selfcls にアクセスできないので、同じクラス内の別のメソッドを呼ぶことができません。 class method は、cls 経由で自分のクラス自身にアクセスできるので、これが可能です。

以下に例を示します。

class MyClass1:
    @staticmethod
    def static_func():
        self.another_static_func()

    @staticmethod
    def another_static_func():
        print("another")

class MyClass2:
    @classmethod
    def class_func(cls):
        cls.another_static_func()

    @staticmethod
    def another_static_func():
        print("another")


# mc = MyClass1()
# mc.static_func()

# 実行結果
# >>>  Traceback (most recent call last):
#  File "prog.py", line 21, in <module>
#    mc.static_func()
#  File "prog.py", line 4, in static_func
#    self.another_static_func()
# NameError: name 'self' is not defined

mc = MyClass2()
mc.class_func()

# 実行結果
# >>> another

オブジェクト指向 UI デザイン

ウェブで一部読んで気になっていた本。

以下は自分の解釈です。

  • 機能要求から作ると、最短コースをとろうとすると、タスク指向になりがちです。
  • 画面部品をオブジェクト指向で使っても、タスク指向 UI になるかオブジェクト指向 UI になるかは関係がないです。
  • この本には、ドメイン モデルまで作った後に、実際の画面にする重要なノウハウが記載されています。たとえば
    • シングル ビューとコレクション ビューの視点でのドメイン モデルの整理の方法 (ここが一番なるほどと感じた)
    • オブジェクト間の関係の種類に応じた画面パターン
    • CRUD の種類に応じた画面パターン

すこし理解が曖昧なので以下はもう一度読んでから整理します。

  • メールにおけるフラグはオブジェクトでなくオブジェクトに1つだけつけられる属性。
  • 基本は、アクションを実行するためのボタン、もしくはそれに準じたコントロールを、アクションの対象となるオブジェクトの近くに配置すること。
  • 新規作成は、コレクションビューに配置している。create アクションのパターンは以下の通り。
    • ブランクパターン
    • パラメーターパターン
    • プレースホルダーパターン
    • セーブアズパターン
    • テンプレートパターン
    • マスターパターン
    • ワンタイムモードパターン
    • ガッツパターン
  • 簡易ツールならタスク指向のほうがいいかもと思いました。工数は増えるんですよね。

以上です。また更新します。

Text Mining: Concepts, Implementation, and Big Data Challenge

テキスト分類とクラスタリングについて、包括的にまとめた一冊です。

知りたいこと

  • Text Indexing とは何か (p.19)
  • テキスト分類の全体的な流れはどのようなものか
  • Tokenization 時に気をつけることは何か
  • Stemming では何をするべきか
  • Stop Words には何を指定するのが一般的か
  • Additional Further Steps とあるが何をするのか
  • 評価の方法は

Text indexing とは何か

Text indexing とは、文や複数の文を単語のリストにすることです。

そういえば、過去に Text indexing を明確に 1 つのプロセスと考えず、 非構造化されたままプログラムを書いたことがあります。見通しが悪くなった記憶があります。

テキスト分類の全体的な流れはどのようなものか

おおよそ以下の流れになるようです。

  • Text inexing
    • Tokenization
    • Stemming
    • Stopword Removal
    • Additional Steps
      • Index Filtering
      • Index Expansion
      • Index Optimization
  • Text Encoding
    • Feature Selection
    • Feature Value Assignment
  • Modeling
  • Evaluation

Tokenization 時に気をつけることは何か

私が忘れたことのある処理です。

  • 大文字を小文字に変換する
  • 16% などの数や記号が含まれた語は捨てる

Stemming では何をする

Stemming では Root にします。(例: simplest → simple)

日本語ではどうするのが良いのかは別にまとめます。

Stopword には何を指定する?

英語では on, to, in, but, however などを指定します。 negative な単語は、感情の推定時などには、例外的に残します。

Additional Further Steps とは

Index Fitlering

重みの小さな語を捨てることです。

捨て方には大きく 3 つのアプローチがあります。 1. ランク ベースのアプローチ。決まった個数の上位の単語を残します。 2. スコア ベースのアプローチ。しきい値以上の単語を残します。 3. 混合アプローチ。

単語の位置によって、捨てるか捨てないかを変える方法もあります。 パラグラフの最初と最後には重要な語があります。

事前に文長を検討することは重要で、 文長が短い場合は情報が落ちる可能性が大きくなるので、 Index Filtering を行わないことがあります。

Index Expansion

文に含まれていない関連のある語を追加することです。

External words (virtual words) という、関連のある単語を、検索エンジンを使って取得します。 これにより、単語数が増えます。

ここでは、Collocation を使います。


\displaystyle
\mathrm{collocation}(\mathrm{term}_i, \mathrm{term}_j) = \frac{2 D F_{ij} }{ DF_i + DF_j }

Index Optimization

単語毎に以下を選ぶ問題として最適化することのようです。

  • そのままにする
  • index filtering の対象(除去)
  • index expansion の対象(拡張)

評価の方法は?

後で書きます。

DEEP LEARNING FOR SYMBOLIC MATHEMATICS

arxiv.org

これは積分と ODE を Seq2seq で解くという論文です。

知りたいこと

  • 入力は木?それはどのように入力する?
  • データセットはどのように生成する?微分は簡単だから微分を使う?

モデルへの入力

  • ツリーを入力とするモデル (例:Tree-LSTM, Recurrent Neural Netowrk Grammars など) は学習に時間がかかるため、シークエンスとにした。
  • ツリーをポーランド記法で表現した。

データセットの生成方法

  • 微分を使う方法 (BWD)
  • 解ける問題について CAS で積分する方法 (FWD)
  • Backword generation with integration by parts

BWD では微分積分より長くなるという問題があり、これがかなり影響するようだ。

Document Classification Algorithms

ちょっと古い文献ですが、文書分類で使う特徴選択法について調べるために読みました。

知りたいこと

  • 特徴選択はどれくらいパフォーマンスに影響するのか。
  • Text Classification で使われる特徴選択法はどんなものがあるか

特徴選択はどれくらいパフォーマンスに影響するのか

  • 判別器やデータセットにかなり依存する。
  • 文献ではなんと特徴選択しない SVM が最も良い精度というオチだった。
  • まず手法自体は色々試したほうがいいよね、ということが学べました。

Text Classification で使われる特徴選択法はどんなものがあるか

  • Information Gain
  • Mutual Information
  • Chi-Square
  • Recursive Feature Elmination (RFE)
    • 時間がかかる。
    • 筆者は、高速な方法 (Improved RFE) を提案したようです。

One-class Document Classification

知りたいこと

  • 自分の知らない特徴量の作り方は何かあるか。

Hadamard Product

筆者は、アダマール積という特徴量が有効だと言っています。

アダマール積といっても、何のことはなく、Bag of words の重みづけに、 トレーニングデータでの単語の出現回数を使う方法です。

タスクによってはよいのかもしれないです。 (この文献のタスクは One-class のため、有効に効きそうです)

レーニングデータの文書数が増えると、 重みが Document Frequency に近づくと思いますので、 コーパスによっては、IDF とは逆の傾向が出ると思います。 通常 TF-IDF がうまくいくことを考えると、 One-class でないタスクにはうまくいかなそうな印象を持ちました。

マルチラベル文書分類での特徴量生成後の処理

マルチラベルの文書分類タスクで特徴量生成後に行う処理のアプローチを調査しました。

知りたいことは以下の 2 点です。

  • 特徴量を所与として分類を判定する処理にはどんなものがあるか
  • 複数の特徴量を統合する処理にはどんなものがあるか

特徴量を所与として分類を判定する処理の概要

参考文献では、利用可能なアプローチを以下のように整理しています。

  • Knowlede Engineering
  • Machine Learning
    • Popular Approach
      • Multinominal Naive Bayes (pp.38-39)
      • Decesion Tree
      • SVM
      • kNN
    • Unpopular Approach
      • Distance Based Learning (カテゴリ平均を求めておき、距離をみる)
        • Euclidean distance
        • Projection distance
        • Modified Projecction distance
      • Linear Discriminant Function
      • Regularized Linear Discriminant Function (ドキュメント数が特徴量の次元数より少ないとき)
      • Logistic Regression

正解データ数が少ないときに、判別機の学習を行わず、事例ベースでコサイン類似度などで判定を行う方法を使うことがあります。 この方法は、kNN の  k=1 のバージョンつまり最近傍法としておくと、上の整理の枠組みに収まります。

複数の特徴量を統合する処理

参考文献では FI (Feature Integration) としていますが、これはドキュメントの複数の特徴量を単純に連結する方法です。 次元がどんどん増えてしまうものの、PCA で次元を落とせば問題ないようです。

参考文献

Automated Document Classification: Methods and Algorithms

Automated Document Classification: Methods and Algorithms

※文書分類の流れ

  1. Feature Generation
  2. Feature Reduction
  3. document frequency
  4. Learning
  5. Classification

※参考文献 1 の提案手法について

  • TF-IDF よりも RFPT (Relative term Frequency with Power Transformation) の方が優れているという主張。
  • OCR で取得した、文字認識に間違いのあるデータに対して RFPT が効果的らしい。面白い観点です。
  • 次元削減の方法としては PCA と、正準相関分析(CDA) を組み合わせて使用。