Colorful Wires

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

docx + jinja2 テンプレートを Python から使用する

概要

f:id:moge560:20200726123332p:plain

この記事では、Python で docx ファイルにおいて jinja2 テンプレートを使用可能にするパッケージ python-docx-template の使い方を整理します。

インストール

pip install docxtpl

基本の使い方

docx ファイルに jinja2 形式でコマンドを記入します。

f:id:moge560:20200726174346p:plain
docx ファイルに jinja2 形式のコメントを記入する

よく使うのは以下のコマンドです。

  • 変数の表示:{{ 変数名 }}
  • ループ:{% for element in sequence %} {element.myproperty} {% endfor %}

書けたら以下のスクリプトで処理します。

from docxtpl import DocxTemplate
doc = DocxTemplate("template_demo.docx")
doc.render(
  {
    "xs": [
      { "name":" taro", "age": 16 },
      { "name": "hanako", "age": 20 },
    ],
  }
)
doc.save("out.docx")

通常の jinja2 との違い

  • タグは run 単位でしか書けません。run は同じ書式の文字列の系列のことです。

所感

仕事でレポート生成に使うので調査しました。

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 でないタスクにはうまくいかなそうな印象を持ちました。