FC2ブログ

[開発] Google Cloud API を使うにあたり直面した問題

------------------------------
■ LOG#01 -- closed // 20190808
Tag: cp932 UnicodeEncodeError
事象
UnicodeEncodeError: 'cp932' codec can't encode character '\u014c' in position 99677: illegal multibyte sequence

-----
原因
データ出力時に文字コードを指定していないため
print("raw response:", "\n", response, "\n")
targetCsvFile = open('output.json', mode='w', newline='')

-----
対処
文字コードを指定する
targetCsvFile = open('output.json', mode='w', newline='', encoding='utf-8')


------------------------------
■ LOG#02 -- cloased // 20190808
Tag: Google NL API INVALID_ARGUMENT
事象
Google NL API - Entity Extraction を読んでエラった
{'error': {'code': 400, 'message': 'The document is larger than the maximum size of 1000000 bytes.', 'status': 'INVALID_ARGUMENT'}}

-----
原因
入力文字数が上限を超えている

-----
対処
入力文字列を25万弱にして再実行

------------------------------
■ LOG#03 -- closed //20190814
Tag: Java JDK JRE dbeaver exit code 13

事象
dbeaver を使おうとしてエラー
エラーコード 13 で Eclipse が起動できない
Java was started by returned exit code=13
-----
原因
JREJDKのバージョンが一致していない為
-----
対処
既存のJavaJREもSDKもアンインストール
為念PC再起動
dbeaver が依存するJave versionを確認 --> ver1.8
JDK/JREをインストール。どちらも v1.8
jre-8u221-windows-i586.exe
jdk-8u221-windows-i586.exe
JREdbeaverのインストーラをDLし実行
dbeaver-ce-6.1.4-x86_64-setup.exe

Ref.
エラーメッセージ「Java was started but returned exit code=13・・・」が出て起動できないとき
http://xn--y8jl6lta.jp/%E7%9F%A5%E8%AD%98%E3%81%AE%E3%83%9A%E3%83%BC%E3%82%B8/Eclipse/%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%8C%E5%87%BA%E3%81%A6%E8%B5%B7%E5%8B%95%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%A8%E3%81%8D.html
Eclipseが起動しない「Java was started but returned exit code=13」
https://blog.clock-up.jp/entry/2015/01/17/eclipse-exit-code-13

------------------------------
■ LOG#04 -- closed //20190814
Tag: ImportError automl_v1beta1 google.cloud unknown location conda pip google-cloud-automl

事象
GCP AutoML NLのモデルをpythonから実行しようとして ImportError
ImportError: cannot import name 'automl_v1beta1' from 'google.cloud' (unknown location)

-----
原因
パッケージ (automl_v1beta1) がインストールされていない為
Anaconda にも無いため、以下なコマンドは叩けない
|C:{user}> conda install -c conda-forge google-cloud-automl
ref.
https://anaconda.org/search?q=automl_v1beta1

-----
対処
$ pip install google-cloud-automl
Collecting google-cloud-automl
Downloading https://files.pythonhosted.org/packages/1a/d2/54d91e8bda501ea80126d1c46f255008bba4e03ce3fa4f3738511f96def1/google_cloud_automl-0.4.0-py2.py3-none-any.whl (208kB)
...
Installing collected packages: google-api-core, google-cloud-automl
Found existing installation: google-api-core 1.13.0
Uninstalling google-api-core-1.13.0:
Successfully uninstalled google-api-core-1.13.0
Successfully installed google-api-core-1.14.2 google-cloud-automl-0.4.0

ref.
How to install google.cloud automl_v1beta1 for python using anaconda?
https://stackoverflow.com/questions/55606725/how-to-install-google-cloud-automl-v1beta1-for-python-using-anaconda

tag : cp932 UnicodeEncodeError Google NL API INVALID_ARGUMENT Java JDK JRE dbeaver

2019-08-18 12:11 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] MeCab で日本語の表記揺れを正規化してみる

Tag: MeCab 和布蕪

MeCab - 結構いろいろ出来るぽい
  高速解析
  辞書整備
  未知語処理 (独自処理定義)
  自己学習

MeCabで使える辞書
  IPA辞書
  Juman辞書
  UniDic辞書
  mecab-ipadic-neologd

■ 独自辞書の定義
http://taku910.github.io/mecab/dic.html

PythonMeCab 使ってみる
観点
  OS - Windows or Linux / MacOS
  OS version - 32bit or 64bit
  Python version - 2 or 3

MeCab をダウンロード
  http://taku910.github.io/mecab/
  Home > ダウンロード > Binary package for MS-Windows > mecab-0.996.exe
  // 64bit版
  // https://github.com/ikegami-yukino/mecab/releases/tag/v0.996
MeCab をインストール
  DLしたexeを実行
  // デフォで IPA 辞書 もインストールされる
  インストールする辞書の文字コード: Pythonを使用するのでUTF-8を指定
MeCab で解析
  スタートメニューから MeCab を起動
  「mecab すもももももももものうち」を叩く
  結果(SHIFT-JISでinstallした場合):
    | % mecab すもももももももものうち
    | mecab 名詞,固有名詞,組織,*,*,*,*
    | すもも 名詞,一般,*,*,*,*,すもも,スモモ,スモモ
    | も 助詞,係助詞,*,*,*,*,も,モ,モ
    | もも 名詞,一般,*,*,*,*,もも,モモ,モモ
    | も 助詞,係助詞,*,*,*,*,も,モ,モ
    | もも 名詞,一般,*,*,*,*,もも,モモ,モモ
    | の 助詞,連体化,*,*,*,*,の,ノ,ノ
    | うち 名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
    | EOS
  出力は以下フォーマットでなされてる
  表層形 \t 品詞, 品詞細分類1, 品詞細分類2, 品詞細分類3, 活用型, 活用形, 原形, 読み, 発音
  解析対象と解析結果をファイルにする場合
    | % mecab INPUT -o OUTPUT
  出力フォーマットの変更
    | % mecab -O wakati (わかち書き)
    | % mecab -Oyomi (ヨミ付与)
    | % mecab -Ochasen (ChaSen互換)
    | % mecab -Odump (全情報を出力)
  文字コード変更
    辞書のconfigでcharset変更して再構築する
  環境変数Pathに追加
    コンパネ > 環境変数の変更
    // C:\Program Files\MeCab\bin
    C:\Program Files (x86)\MeCab\bin
    新規にTerminarl/CommandPromptを起動
    mecab コマンド打ってパス追加できたことを確認
      | C:\Users\myuser>mecab
      | すもももももももものうち
      | すもももももももものうち 險伜捷,荳€闊ャ,*,*,*,*,*
      | EOS
      // UTF-8でMecab入れたから文字化けしてる
mecab-python の導入
  Python上で使えるようにMeCabバインディングを導入する
  バインディング = 外部プログラムを利用できるようにするライブラリなもの
  //Python3 用のバインド: mecab-python3
  Windows 用の mecab-python-windows を入れる
  Windows > Start Menu > Anaconda3 > Anaconda Powershell Prompt
  | (base) PS C:\Users\{user}> pip install ipykernel
  | (base) PS C:\Users\{user}> pip install mecab-python-windows
  以下をコピー
  C:\Program Files (x86)\MeCab\bin\libmecab.dll
  以下にペースト
  C:\Users\{user}\AppData\Local\Continuum\anaconda3\Lib\site-packages
  // site-packages に既存してたものは退避しといた
  導入完了の確認
    CommandPromptを起動
    "python"を入力してEnterし、pythonを実行状態にする
    import MeCab と入力してEnterしてerrorでなければ成功
    --> エラーなった。。
    | ImportError: DLL load failed: %1 は有効な Win32 アプリケーションではありません。
    恐らく以下が要れるべきものだった。(TopPageのは32bit用だと思われる)
    mecab-0.996-64.exe
Python で MeCab
  | import sys
  | import MeCab
  | m = MeCab.Tagger ("-Ochasen")
  | print(m.parse ("すもももももももものうち"))

Ref.
MeCabの使い方の備忘録
https://kanji.hatenablog.jp/entry/how-to-use-mecab
PythonとMeCabで形態素解析(on Windows)
https://qiita.com/menon/items/f041b7c46543f38f78f7

TBC
64Bit版Windows10でMecabをインストールする方法
https://toolmania.info/post-9815/
Windows上のPythonからMeCabを利用する
https://tech-fill.net/python-mecab-windows/
Windows10にMeCabをインストール
http://blog.livedoor.jp/oyajieng_memo/archives/1749255.html
pythonでMeCabを使う(各OSでのインストール、NEologd、辞書のカスタマイズなど)
https://www.pytry3g.com/entry/2018/04/24/143934
今更ながらPythonとMeCabで形態素解析してみた
http://tech.innovation.co.jp/2017/07/28/mecab.html

tag : Python MeCab

2019-07-24 07:19 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] コーパスクリーニング / 自然言語解析の前処理

前処理の順序
  クリーニング
  単語分割
  単語の正規化
    文字種の統一
    数字の置き換え
    辞書を用いた単語の統一
  ストップワード除去
  単語ベクトル表現

主要処理
  クリーニング
    テキスト属性の除去
      e.g. htmlタグ
      処理方法
        正規表現
          正規表現オンラインエディタ
          https://regex101.com/
        Python クリーニングライブラリ
          NLTK
            cleaned = nltk.clean_html(oneline.strip())
          Beautiful Soup
            https://www.crummy.com/software/BeautifulSoup/bs4/doc/
            Sample: https://github.com/Hironsan/natural-language-preprocessings/blob/master/preprocessings/ja/cleaning.py
          lxml
            https://lxml.de/
    無駄な行やスペースの削除
      連続する空白/文頭・文末の空白スペースなど
      処理方法
        Python - strip(), rstrip(), lstrip(), replace()
    大文字/小文字の変換: lower(), upper()
    半角/全角の統一 - 英数字, 仮名文字
      処理方法
        unicodedata, neologdn
      // 形態素解析後に正規化をすると結果が分かれる
        e.g. IPA辞書では全角「AB」は分割され,半角「AB」は分割されない
    句読点の統一
      文章の句読点と数値の区切り文字がある
      処理方法
        Python - replace()
    SNSテキスト特有文字列の除去
      e.g. 絵文字,顔文字,ハッシュタグ,URLなど
      処理方法
        emoji(絵文字判定)
    一覧
      https://github.com/neologd/mecab-ipadic-neologd/wiki/Regexp.ja

  単語分割 (トークン化/分かち書き)
    単語分割に使用できる形態素解析器 (トークン化/tokenizing/分かち書き)
      MeCab(単語)
      KyTea(単語)
      Juman++(単語)
      Janome(単語)
      Sudachi(単語)
      Nagisa(単語)
      subword-nmt(サブワード)
      Sentencepiece(サブワード)
      BERTのmultilingual model
    Sample Code:
      https://github.com/Hironsan/natural-language-preprocessings/blob/master/preprocessings/ja/tokenizer.py
    
  単語の正規化 (ノーマライズ/語幹抽出 ステマー/語幹抽出 ステミング/見出し語化 レマタイズ)
    基本形/省略系への変更
      形態素解析結果の利用もあり
    用語(同義語)の統一
      e.g. りんご,リンゴ,林檎
      日本語WordNet
    ライブラリ:
      re(正規表現),
      unicodedata(正規化),
      nltk (wordnet)
      mecab-ipadic-NEologd
        IPA辞書「辛い:3,そう:1,だ:1,ない:1,少し:1,ラー油:1」
        ipadic-NEologd「辛そうで辛くない少し辛いラー油:1」
    Sample Code: https://github.com/Hironsan/natural-language-preprocessings/blob/master/preprocessings/ja/normalization.py

  typo(崩れ表記)
    ライブラリ
      Encoder-Decoder
      pytypo(タイポ判定)
    // Encoder-Decoderモデルの機械学習モデルを使って崩れ表記を正規化 (e.g. Cookpad)
  未知語の処理
  他言語の混入
    // unicodedataで文字種から言語判定
  文字コード
  ストップワード処理
    e.g. 「です」「ます」
    辞書ベースと統計ベース(出現頻度)のやり方がある
    NLTK
      nltk.corpus.stopwords.words('english')
    Sample Code:
    https://github.com/Hironsan/natural-language-preprocessings/blob/master/preprocessings/ja/stopwords.py

  ベクトル化
    主な手法
      one-hot表現
      分散表現
    ライブラリ: word2vec
  フィラー/言い澱みの処理
    MeCabのIPA品詞体系に「フィラー」がある
  マスキング/置き換え処理

使用例
  自然言語処理の前処理・素性いろいろ
  http://yukinoi.hatenablog.com/entry/2018/05/29/120000

Ref.
自然言語(前)処理
https://qiita.com/dcm_sawayama/items/406408e8bda0840a8106
自然言語処理における前処理の種類とその威力
https://qiita.com/Hironsan/items/2466fe0f344115aff177
Python、機械学習、そして NLTK ライブラリーについて探る
https://www.ibm.com/developerworks/jp/opensource/library/os-pythonnltk/index.html
自然言語処理入門 -NLTKを使ってみる
http://blog.roy29fuku.com/natural-language-processing/tutorial-of-nltk/
Natural Language Processing (NLP) Techniques for Extracting Information
https://www.searchtechnologies.com/blog/natural-language-processing-techniques
Python3×日本語:自然言語処理の前処理まとめ
https://qiita.com/chamao/items/7edaba62b120a660657e
TBC
Word2Vecを用いた類義語の抽出が上手く行ったので、分析をまとめてみた
https://qiita.com/To_Murakami/items/cc225e7c9cd9c0ab641e
12.1.5 日本語WordNet - Python による日本語自然言語処理
http://www.nltk.org/book-jp/ch12.html#wordnet
日本語の表記ゆれ問題に関する考察と対処
http://www.japio.or.jp/00yearbook/files/2015book/15_2_07.pdf

tag : Python NLTK MeCab

2019-07-24 07:18 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] Text Analytics APIs

Tag: Google Cloud Natural Language API Watson

自然言語処理
テキスト文字列が対象とするもの - いろいろある
Watson API
Google Cloud Natural Language API NLP
NLP API
Sentiment Analysis API
Text APIs by ParallelDots
TextAnalysis API
Microsoft Text Analytics API
Aylien API
Text Processing API
Twinword APIs

Ref.
Top 10 Best Text Analytics APIs
https://blog.api.rakuten.net/top-10-best-text-analytics-apis/

tag : Google Cloud Natural Language API Watson

2019-07-23 23:31 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] jupyter notebook で Hello World

Tag: jupyter notebook python Anaconda

概要
jupyter notebook とは
Python 言語や Julia 言語のコードをエディタから即実行できるエディタ
Python 環境構築は
Anaconda というディストリビューション(関連便利グッズの詰め合わせ)でのインストールが一般的
その Anacondajupyter notebook も包含されている

準備
- https://www.anaconda.com/ からアナコンダをダウンロードしてインストール
- スタートメニュー > Anaconda3 > Jupyter notebook を実行すると、
  コマンドプロンプトと一緒にブラウザで Jupyter notebook が開かれる
  // ローカルPC内に仮想のホストサーバ―(localhost:8888)をたててブラウザでそこにアクセスしてる
- ブラウザから任意のフォルダまで遷移 (コード保存先)

使用
- 右上の[New]ボタンから[Python3]を選択 -> Untitled.ipynb が生成され新規タブでエディタが表示される
- print("Hello, World!") と入力して Run すれば結果が表示される
- ファイル名は、エディタページ上位の[File]からrenameで改名できる

Ref.
Windowsにjupyter notebookを入れてHello,Worldするまでのメモ(Python & Julia)
https://qiita.com/STInverSpinel/items/9801f30c2fd1a378518d

tag : jupyter notebook python Anaconda

2019-07-23 23:30 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] テキストマイニング とは

Tag: テキストマイニング text mining 自然言語処理 形態素解析 構文解析

テキストマイニング とは
形式化されていないテキストデータ隠れた情報や有用な知見を探し出す解析方法

一般的に言われるテキストマイニングの基本機能
  自然言語処理機能
    形態素解析
    構文解析
    意味解析
  データ操作機能
  データ探索/分析機能

テキストマイニングツール - 代表製品
  見える化エンジン
  TextVoice - オンライン
  Text Mining Studio - NTTデータ
  Magic Insight コグニティブサービス
    IBM Watson
    全機能月額
  Luminoso
    MITからスピンオフしたのが始まり
    人工知能(AI)と自然言語理解(NLU)で構造化データに潜む知見を可能にする
    日本語、中国語、韓国語、アラビア語を含む14言語に対応
    企業は自社が受ける問い合わせのプロセスを簡素化できる
    ConceptNet をコアコンポーネントとしている
  KAIDOKU - https://www.cogent.co.jp/products/kaidoku/

自然言語処理機能 - 代表実装
  Google Cloud Natural Language

Ref.
テキストマイニング関連ソリューションのご紹介
https://www.msi.co.jp/tmstudio/muc16_BR_2_1.pdf
入門 「テキストマイニング」の基本機能
https://it-trend.jp/textmining
テキストマイニングと自然言語処理の違いは何ですか?
https://jp.quora.com/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%9E%E3%82%A4%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%A8%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86%E3%81%AE%E9%81%95%E3%81%84%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99
自然言語理解のLuminoso、1,000万米ドルの資金を調達
https://prtimes.jp/main/html/rd/p/000000001.000040050.html

tag : テキストマイニング text mining 自然言語処理 形態素解析 構文解析

2019-07-23 23:28 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] Cloud Dataprep by Trifacta / MeCab は何ができるの?

Tag: Cloud Dataprep by Trifacta MeCab

Cloud Dataprep by Trifacta の提供機能
  パラメータ化の概要
    データソースのパスのパラメータ化
  パターン マッチングの概要
    正規表現で電話番号とかの表記を標準化
    ユーザで定義追加可能
  予測変換の概要
    統計的操作 - 外れ値、補完
    再構築 - データ抽出
    クリーニング - 標準化、重複除去
    エンリッチメント - 他のデータとの結合
    抽出 - 集計
  サンプリングの概要
  Automator の概要
    処理フローをスケジューリング
  共有の概要
    複数のユーザーが同じアセットで作業できる
  ビジュアル プロファイルの概要
  RapidTarget の概要
  標準化の概要
    スペルの違い、大文字小文字、空白、その他のエラーを修正
  Filter Data
    表示の話
    カラムの非表示など

MeCab の提供機能
  -r  --rcfile  FILE  使用するリソースファイルを指定する
  -d  --dicdir  DIR  使用するシステム辞書を指定する
  -u  --userdic  FILE  使用するユーザ辞書を指定する
  -l  --lattice-level  INT  索性レベルを指定する
  -D  --dictionary-info    辞書の情報を表示する
  -a  --all-morphs    該当する全ての形態素を表示する
  -O  --output-format-type  TYPE  出力するフォーマット形式を指定する
  -p  --partial    制約付き解析(部分解析)
  -F  --node-format  STR  Nodeの出力方式を設定する
  -U  --unk-format  STR  未知語の出力形式を設定する
  -B  --bos-format  STR  BOSの出力形式を指定する
  -E  --eos-format  STR  EOSの出力形式を指定する
  -S  --eon-format  STR  N Bsetの終端文字列を指定する
  -x  --unk-feature  STR  未知語のfeature文字列を指定する
  -b  --input-buffer-size  INT  入力文字列のバッファサイズを指定する
  -P  --dump-config    MeCabのパラメータを表示する
  -M  --open-mutable-dictionary    mutable辞書を開く(実験中)
  -C  --allocate-sentence    入力文に新しいメモリを割当てる
  -N  --nbest  INT  最良の解析結果を上位N個表示する
  -t  --theta  FLOAT  thetaを指定する
  -c  --cost-factor  INT  cost factorを指定する
  -o  --output  FILE  出力するファイルを指定する
  -v  --version    バージョン情報を表示する
  -h  --help    ヘルプを表示する

Ref.
Cloud Dataprep by Trifacta - 機能の概要
https://cloud.google.com/dataprep/docs/html/Feature-Overviews_118228664?hl=ja
MeCabのコマンドライン引数一覧とその実行例
http://www.mwsoft.jp/programming/munou/mecab_command.html
Cloud Dataprep Alternatives & Competitors
https://www.g2.com/products/cloud-dataprep/competitors/alternatives

tag : Cloud Dataprep Trifacta MeCab

2019-07-23 22:54 : 開発 : コメント : 0 : トラックバック : 0 :

[開発]Word Normalization - stemming & lemmatizing

自然言語処理における一般的な前処理
  Text/Word Normalization
  自然言語処理適用前に必要な下準備
    文書からテキスト本文を抽出
    テキストを単語に分割 (単語抽出, コーパスクリーニング, Tokenization)
      英語であれば、stemming (単語の語幹の抽出, 表記揺れ対策) や lemmatizing (正規化) といった自然言語処理分野の技術
        stemming と lemmatizing の違い
          lemmatizing は、国語辞書に載ってるような活用形等の正規化。
          stemming は、国語辞書で検知できないような表記揺れが対象
      日本語など空白がない言語であれば、
        分節処理
          cf. N-gram
        形態素解析処理 (単語を分ける明確な区切りがないため)
          cf. MeCab, ChaSen
        ベクトル化
          cf. word2vec, Encoder-Decoder, 国立国語研究所の分類語彙表, NICTのWordNet
        ref.
          Google 提供のNグラム > GSK2007-C Web日本語Nグラム第1版
          日本語文字の正規化 > Unicode NFKC : http://unicode.org/reports/tr15/
            韓国語も対応してそう
    “邪魔”な単語の削除
      e.g. です/ます
      削除対象とする単語 = ストップワード
    単語に ID を割り当て
      出現した単語にそれぞれ ID を採番
      単語 – ID 間の変換辞書を作成
    文書ごとの ID 別頻度表 (bag-of-words) を作成
    // それぞれの工程用のライブラリがOSSで大概ある

information retrieval algorithms / 情報検索アルゴリズム / IR
  Text/Word Normalization を逆手に取ったもの
  Search Engineに使用される
  
  cf.
  CLIR (Cross Language Information Retrieval)
  異言語での同時検索
  
  Ref.
  Built-In Search – Technical Resources, MarkLogic
  https://developer.marklogic.com/features/built-in-search/
  https://docs.marklogic.com/guide/search-dev/stemming
  https://docs.marklogic.com/guide/search-dev/custom-dictionaries
  Stemming, variations, and accent folding
  https://whoosh.readthedocs.io/en/latest/intro.html
  4Uweb/サイト内検索システム「Searchsight」
  https://www.hitachi-sis.co.jp/service/dcom/searchsight/feature4.html

コーパスクリーニング
  大文字/小文字の変換
  句読点の統一
  用語(同義語)の統一
    Ref.
    日本語WordNet
    http://compling.hss.ntu.edu.sg/wnja/
    Weblio辞書も活用
    同義語集合 (synset)
      見出し語 (lemma)
      上位概念 (hypernym)
      下位概念 (hyponym)
  無駄な行やスペースの削除
  テキスト属性によるクリーニング - e.g. htmlタグなどの構造タグ
  SNSテキスト特有の文字 - e.g. 絵文字,顔文字,ハッシュタグ,URLなど
  未知語の処理
  文字コード
  基本形/省略系への変更
  他言語の混入
    unicodedata
  typo(崩れ表記)を直す
    Encoder-Decoderモデル
  ストップワード処理
  半角/全角の統一(正規化)
  新旧漢字
  拗音、微差音
  etc. : フィラー/言い澱みの処理
  etc. : マスキング/置き換え処理

Stemming Algorithms
  ざっくり3つ分類
  代表的なアルゴリズム
    Truncating - Porters
    Statistical - N-Gram
    Mixed - Corpus Based
  言語別に存在する
  英語であれば
    Lancaster - 基本的にルールベース。Porterよりも高速
    Porter - 基本的にルールベース
    Snowball Stemmers - 多言語に対応する。英語はPorterが使用されている。 - 東亜国の中国語、日本語、韓国語 (CJK) はないぽい
    その他
      Hunspell stemmer - カスタムを追加できる
      Dictionary stemmer - ref. lexoconista.com
      Application: Emotion word usage
      Application: Spell-corrected tokens
      Efficiency considerations
  それらモデルを纏めたのが、NLTKCJKはやはり対象外
  日本語であれば
    MeCab
      オープンソースの形態素解析器
      動作が非常に高速
      辞書の配布や辞書の作成も可能
      テキスト変換器として設計されている
    mecab-ipadic-NEologd
      Web上から得た新語に対応
      毎週更新されるMeCab用のシステム辞書
  Ref.
  open-source library 一覧:
  Text Preprocessing in Python: Steps, Tools, and Examples
  https://medium.com/@datamonsters/text-preprocessing-in-python-steps-tools-and-examples-bf025f872908



Ref. Solution
  コーパスクリーニング用ライブラリ(Python)に掛ける
    unicodedata(正規化)
    re(正規表現)
    pytypo(タイポ判定)
    emoji(絵文字判定)
    lxml
    nltk
  Tableau Prep
  ビタビアルゴリズム
  隠れマルコムモデル
  Bag of Words (BoW) / トピックモデル
  Neural Network

文章校正ツール
  文章校正と表記ゆれチェックツール
  https://chrome.google.com/webstore/detail/%E6%96%87%E7%AB%A0%E6%A0%A1%E6%AD%A3%E3%81%A8%E8%A1%A8%E8%A8%98%E3%82%86%E3%82%8C%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%83%84%E3%83%BC%E3%83%AB/melcjmapbnbppalonglljkadkemjajjf?hl=ja
  【文賢】文章の校閲・推敲支援ツール
  https://chrome.google.com/webstore/detail/%E3%80%90%E6%96%87%E8%B3%A2%E3%80%91%E6%96%87%E7%AB%A0%E3%81%AE%E6%A0%A1%E9%96%B2%E3%83%BB%E6%8E%A8%E6%95%B2%E6%94%AF%E6%8F%B4%E3%83%84%E3%83%BC%E3%83%AB/nnldfkgncpcbcepicoikdjcfgoofiega?hl=ja


文字列の一括置換
  MultiReplace - フリーツール
    http://www2u.biglobe.ne.jp/~shunbook/omocha/multireplace.htm

cf.
Google Cloud AutoML Natural Language Entity Extraction
辞書定義が困難なタイポや未知語(異言語混入)などを想定した場合に有用そう
https://cloud.google.com/natural-language/automl/entity-analysis/docs/?hl=ja
対応言語
https://cloud.google.com/natural-language/docs/languages?hl=ja

続きを読む

tag : AutoML MeCab NLTK CJK Snowball Stemming CLIR IR 自然言語処理

2019-07-20 22:40 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] Google Cloud Translation API 界隈でのエラー

------------------------------
■ LOG#01 - closed //20190714
Tag: KeyError errors ignore pandas json_normalize
事象
Json を二次元に parse しようと

|dataFrame = json_normalize(jsonDict
|  , record_path = ['sentences']
|  , sep = '_'
|  , meta = [['text','content'], 'lemma']
|  )

を叩いたら KeyError になった

KeyError: "Try running with errors='ignore' as key 'text' is not always present"

-----
原因
Jsonのレコードによって構成が異なってるため

-----
対処
|dataFrame = json_normalize(jsonDict
|  , record_path = ['sentences']
|  , meta = [['text','content'], ['partOfSpeech', 'tag'], 'lemma']
|  , sep = '_'
|  , errors = 'ignore'
|  , record_prefix='_'
|  )

------------------------------
■ LOG#02 - closed //20190714
Tag: KeyError
事象
Json を二次元に parse しようと

|dataFrame = json_normalize(jsonDict
|  , record_path = ['sentences']
|  , sep = '_'
|  , meta = [['text','content'], 'lemma']
|  , errors = 'ignore'
|  )

を叩いたら KeyError になった

|'need distinguishing prefix '.format(name=k))
|ValueError: Conflicting metadata name lemma, need distinguishing prefix

-----
原因
record_prefix='_' が指定されていない為

-----
対処
|dataFrame = json_normalize(jsonDict
|  , record_path = ['sentences']
|  , meta = [['text','content'], ['partOfSpeech', 'tag'], 'lemma']
|  , sep = '_'
|  , errors = 'ignore'
|  , record_prefix='_'
|  )

------------------------------
■ LOG#03 - closed //20190714
Tag: JSONDecodeError Expecting property name enclosed in double quotes
事象
Json を
|jsonFile = open(targetJsonFileName,'r',encoding="utf-8")
|jsonDict_fullOriginal = json.load(jsonFile)
|jsonFile.close()
|で load しようとして
|json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

-----
原因
Jsonファイル内のプロパティ名をシングルクォートで囲ったためのエラー
|>>> json.loads('{"a": 123}') # これはOK
|{'a': 123}
|>>> json.loads("{'a': 123}") # これはエラー
|# 略
|json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

-----
対処
ロード対象のJsonファイルのコンテンツをダブルクォートに直す
量が凄まじい時は、 http://jsoneditoronline.org/ の Repair Json も一手

------------------------------
■ LOG#04
Tag: Python anaconda OAuth google-api-python-client Google Cloud Translation API
事象
Google Cloud Translation API を Natual Language API と同様に実行しようとして認証エラーになった
|'code': 401, 'message': 'Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.', 'status': 'UNAUTHENTICATED'}

-----
原因
integrate Google Sign-In into your websiteが必要で
その為には client ID を生成してそれでAPIを呼ばないといけないらしい

-----
対処
1. OAuth Client ID の作成
GCP Console > API & Service > 認証情報 > 認証情報を作成 > OAuth Client ID > 同意画面を設定
アプロケーション名: MyTmpApplication
後は default (空欄) で作成ボタン押下
アプリケーションの種類: その他
名前: MyTmpClientIDName (自分が参照する用途)
作成完了
| クライアント ID とシークレットには、常に API とサービスの認証情報からアクセスすることができます
| OAuth 同意画面が公開されるまで、OAuth ではプライベート データにかかわるスコープのログインが 100 回までに制限されます。公開には確認プロセスが必要になる場合があり、確認プロセスには数日を要する場合があります。

2. Client secret のダウンロード
GCP Console > API & Service > 認証情報 > OAuth 2.0 クライアント ID > JSONをダウンロード
以下に保存
|C:\credentials\google\GOOGLE_CLIENT_SECRET
|client_secret_xxxxxx.apps.googleusercontent.com.json を client_secret.json に rename

3. Google Client Library のインストール
|C:{user}> conda install -c conda-forge google-api-python-client

4. oauth2client のインストール
|C:{user}> conda install -c conda-forge oauth2client

5. 認証の実装
断念

Ref.
【初学者向け】Python 基礎1 関数定義と呼び出し
https://qiita.com/ryo_xsjsj/items/c0b64f3679da9d168aaa
A beginners guide to Google OAuth and Google APIs
https://medium.com/@ashokyogi5/a-beginners-guide-to-google-oauth-and-google-apis-450f36389184

------------------------------
■ LOG#05 - closed //20190716
Tag: ImportError
事象
Google Cloud Translation API を実行しようとして ImportError になった
|ImportError: cannot import name 'translate_v3beta1' from 'google.cloud' (unknown location)

-----
原因
ライブラリ不足

-----
対処
|C:{user}> conda install -c conda-forge google-cloud-translate

tag : Google Cloud Translation API ImportError translate_v3beta1 OAuth Python anaconda JSONDecodeError

2019-07-19 08:50 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] Google AutoML Natural Language を使ってみる

Official Page
https://cloud.google.com/natural-language/automl/docs/quickstart?hl=ja

脱線
  Kaggle / カグル
    データサイエンスと機械学習の家
    Kernels / カーネル
      各データセットに対して他のユーザーが構築した予測モデルのコードや説明が公開されている
    チュートリアル
      https://www.codexa.net/kaggle-mercari-price-suggestion-challenge/

AutoML NL を使うための GCP での下準備
  Google Cloud Storage(GCS) バケットを作成
    // Skip OK - AutoMLを有効にした時点で勝手に生成される
    // AutoML NL の仕様で、バケット名はプロジェクト名の後に “-lcm” を付けたものを指定する必要あり
    // https://cloud.google.com/natural-language/automl/docs/before-you-begin?hl=ja#create_a_cloud_storage_bucket
  AutoML NL を有効化
    GCP Console > 人工知能 > Natural Language > 自然言語プロダクト > AutoML テキスト分類 > アプリを起動
    Finish setting up your Google Cloud project > SET UP NOW > Project ID を選択
  トレーニングデータをPythonで前処理する
    データフォーマット要件
      - UTF-8
      - 1改行までを1テキストデータ
      - CSV
      - 1列目にテキストデータ、2-3列目にラベル
      - you need at least two labels
      - At least 10 text items should be assigned to each label.
    データ加工
      - [\r\n] を ["\r\n"] に置換
      - 2列目にタグを追加
    加工後のファイルを GCS bucket へアップロード
      //# auth.authenticate_user() で GCP への認証を行う
      ブラウザ越しに直にアップロード
    AutoML NL 用にタグ付け
      GCP Console > AutoML Natural Language > NEW DATASET
      Objective に Single-label classification
      bucket 経由でファイル指定でupload
      暫し待つ。結構長い。多分10分前後は待ったかも。500行で。
    モデル作成/更新
      TRAIN > START TRAINING
      // 500件行程で4時間弱
      // ボタン押せばページ閉じてもOK。終わったらメールが来る
    モデルを評価
      EVALUATE 押下
      値が 1.0 に近いほど精度が高いことを示す
    モデルで検証
      PREDICT 押下
      検証データを入力


Ref.
AutoML Natural Language を使って文豪っぽさを推定する, 2019/05/29
https://www.apps-gcp.com/automl-natural-language-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E6%96%87%E8%B1%AA%E3%81%A3%E3%81%BD%E3%81%95%E3%82%92%E6%8E%A8%E5%AE%9A%E3%81%99%E3%82%8B/
改行コードのまとめと覚え方
https://www.cyamax.com/entry/2017/08/01/070004

tag : Google AutoML Natural Language Kaggle

2019-07-19 08:42 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] 自然言語処理(NLP) & 形態素解析

自然言語処理(NLP)
  上位層から以下のように分解される
    Pragmatics - commumication through language
    Semantics - meaning, implication, logic
    Syntax - sentences, grammar, phrases
    Morphology - characters, words
    Phonology - sound patterns

  NLP のプロセス
    Data Collection
    Data Pre-Processing
    Feature Engineering
    NLP Algorithms

  サービス
    Amazon Comprehend
      機械学習を使用してテキスト内でインサイトや関係性を検出する自然言語処理 (NLP) サービス

形態素解析
  「自然言語」を形態素(単語の最小単位)にまで分割する技術
  
  応用例
    検索エンジン
    AIの自然言語処理
    スマートニュース(SMARTNEWS)
  日本語形態素解析ツール
    MeCab
      http://taku910.github.io/mecab/
      使用可能言語: C, C#, C++, Java, Perl, Python, Ruby, R
      さまざまな辞書と連結可能
      日本語の形態素解析エンジンの中では最も良く使われてる
    juman
      文字コードであるUTF-8に対応
      WEBテキストから自動獲得された辞書
      Wikipediaから抽出された辞書を使用可能
      MeCab よりも単語の意味分類を細かく実施する
      解析した単語をカテゴリなどで分けて集計することも可能
    Janome
      PurePythonベース
      juman 同様、辞書がはじめから内包されて
    その他
      RakutenMA
      kuromoji
      KyTea
  日本語形態素解析ツール
    Tree Tagger
      ドイツ語、フランス語、スペイン語などにも対応
      Windows、Mac、Linuxどの環境でも使用可能
      PythonからTree Taggerを使用することも可能
      単語を分類した時に品詞コードを表示
    NLTK
      Natural Language Tool Kit
      Python用ライブラリ
      品詞のタグ付けに構文解析、また意味解析などが簡単にできる
      文字列を対象としたデータマイニングであるテキストマイニングにも利用可能
  描画ツール
    モデルだけあっても仕方がない
    検証結果の描画 (visualization) が必要
    Ref.
    プログラミング不要! 約50のAI構築GUIツールをまとめたサービスマップを公開!
    https://ainow.ai/wp-content/uploads/2019/07/gui-ai_map-3.png
    https://ainow.ai/2019/07/09/173221/

tag : MeCab juman Janome Python RakutenMA kuromoji KyTea Tree Tagger NLTK

2019-07-19 08:39 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] 手っ取り早くGCPを習得したい

GCP はネタが多過ぎて勘所を持ち合わせぬ人が模索するにはブラックホール過ぎる
が、どこの馬の骨とも分からぬとこが開催する研修に参加するのは時間的にも金銭的にもリスクが高い
なんで、本家が管轄するコースを受講したい!とググったら見つけたよ

Google Cloud トレーニング
https://cloud.google.com/training/?hl=ja

コースカタログ
https://cloud.google.com/training/course-catalog?hl=ja

Google Cloud Platform Big Data and Machine Learning Fundamentals 日本語版
https://cloud.google.com/training/courses/data-ml-fundamentals?hl=ja
https://www.coursera.org/learn/gcp-big-data-ml-fundamentals-jp?utm_campaign=GoogleCloud_Training_GoogleCloud_Training_BDML_bigdata_ml&utm_medium=institutions&utm_source=googlecloud

但し、有料
上記のコースで JPY5,299/Month @courses

経費で落ちないかなぁ...w

tag : GCP

2019-07-10 00:17 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] Google Natural Language API の為のトラブルシューティング

Tag: Python GCP UnicodeDecodeError cp932 INVALID_ARGUMENT encodingType classifyText ModuleNotFoundError PackagesNotFoundError Anaconda google-cloud-language conda DefaultCredentialsError GOOGLE_APPLICATION_CREDENTIALS

■ LOG#01 - closed //20190709
事象
UnicodeDecodeError: 'cp932' codec can't decode byte 0x84 in position 32: illegal multibyte sequence
-----
原因
Python は明示的に変換しなくても、標準出力等をする場合に UTF-8 を CP932 に自動的にシステムのエンコーディングに変換してから出力しようとする。
-----
対処
open 時に encoding を utf-8 に指定する。
対象ファイルが BOM 付きの場合は utf-8_sig を指定する

------------------------------
■ LOG#02 - closed //20190709
事象: 400 INVALID_ARGUMENT
Request: https://language.googleapis.com/v1/documents:classifyText?key={APIKey}
 |{
 | "document": {
 |  "type": "PLAIN_TEXT",
 |  "content": "Google, headquartered in Mountain View (1600 Amphitheatre Pkwy, Mountain View, CA 940430), unveiled the new Android phone for $799 at the Consumer Electronic Show. Sundar Pichai said in his keynote that users love their new Android phones."
 | },
 | "encodingType": "UTF8"
 |}
Response:
 |{
 |  "error": {
 |    "code": 400,
 |    "message": "Invalid JSON payload received. Unknown name \"encodingType\": Cannot find field.",
 |    "status": "INVALID_ARGUMENT",
 |    "details": [
 |      {
 |        "@type": "type.googleapis.com/google.rpc.BadRequest",
 |        "fieldViolations": [
 |          {
 |            "description": "Invalid JSON payload received. Unknown name \"encodingType\": Cannot find field."
 |          }
 |        ]
 |      }
 |    ]
 |  }
 |}

-----
原因
Request にある encodingTypeclassifyText でサポートされていない変数だから

-----
対処
Request からその変数を除去する

------------------------------
■ LOG#03 - closed //20190709
Tag: ModuleNotFoundError py
事象
  |>Python test.py
  |Traceback (most recent call last):
  | File "test.py", line 23, in
  |  from google.cloud import language
  |ModuleNotFoundError: No module named 'google'
-----
原因
google.cloud がインストールされていない
-----
対処
依存するライブラリをインストールする

------------------------------
■ LOG#04 - closed //20190709
Tag: conda install google.cloud PackagesNotFoundError
環境: Windows/Anaconda
事象: condaでのインストールに失敗する
 |>conda install google.cloud
 |  Collecting package metadata: done
 |  Solving environment: failed
 |  PackagesNotFoundError: The following packages are not available from current channels:
 |   - google.cloud
 |  Current channels:
 |   - https://repo.anaconda.com/pkgs/main/win-64
 |   - https://repo.anaconda.com/pkgs/main/noarch
 |   - https://repo.anaconda.com/pkgs/free/win-64
 |   - https://repo.anaconda.com/pkgs/free/noarch
 |   - https://repo.anaconda.com/pkgs/r/win-64
 |   - https://repo.anaconda.com/pkgs/r/noarch
 |   - https://repo.anaconda.com/pkgs/msys2/win-64
 |   - https://repo.anaconda.com/pkgs/msys2/noarch
 |  To search for alternate channels that may provide the conda package you're
 |  looking for, navigate to
 |    https://anaconda.org
 |  and use the search bar at the top of the page.
-----
原因
Anaconda Cloud ( https://anaconda.org/ )で管理されていないパッケージな為
-----
対処
1: anaconda-client で Anaconda Cloud 上のリポジトリを検索
  |C:\{user}\python>anaconda search -t conda google-cloud-language
  |WARNING: The conda.compat module is deprecated and will be removed in a future release.
  |Using Anaconda API: https://api.anaconda.org
  |Packages:
  |   Name           | Version | Package Types  | Platforms    | Builds
  |   ------------------------- |  ------ | --------------- | --------------- | ----------
  |   conda-forge/google-cloud-language |  1.2.0 | conda      | linux-64, win-64, osx-64 | py37_0, py36_0, py37h21ff451_0, py36h21ff451_0, py27_0
  |                     : Python Client for Google Cloud Natural Language
  |   hill-country-machine-learning/google-cloud-language |  1.2.0 | conda      | linux-ppc64le, linux-64, win-32, linux-aarch64, linux-armv7l, osx-64, linux-armv6l, linux-32, win-64 | 0
  |                     : Google Cloud Natural Language API client library
  |Found 2 packages
  |Run 'anaconda show ' to get installation details
2: ブラウザでも Anaconda Cloud にあるか確認
  https://anaconda.org/search?q=google
  -> google-cloud-language ならある
  https://anaconda.org/conda-forge/google-cloud-language
  詳細ページ行って以下を確認
  To install this package with conda run:
  conda install -c conda-forge google-cloud-language
3. CMD でそのコマンドを実行

------------------------------
■ LOG#05 - closed //20190709
Tag: DefaultCredentialsError: Could not automatically determine credentials. Please set GOOGLE_APPLICATION_CREDENTIALS or explicitly create credentials and re-run the application.
事象
  |>Python test.py
  |Traceback (most recent call last):
  | File "test.py", line 27, in
  |  language_client = language.LanguageServiceClient()
  | File "C:\Users\{user}\AppData\Local\Continuum\anaconda3\lib\site-packages\google\cloud\language_v1\gapic\language_service_client.py", line 143, in __init__
  |  address=self.SERVICE_ADDRESS, channel=channel, credentials=credentials
  | File "C:\Users\{user}\AppData\Local\Continuum\anaconda3\lib\site-packages\google\cloud\language_v1\gapic\transports\language_service_grpc_transport.py", line 63, in __init__
  |  channel = self.create_channel(address=address, credentials=credentials)
  | File "C:\Users\{user}\AppData\Local\Continuum\anaconda3\lib\site-packages\google\cloud\language_v1\gapic\transports\language_service_grpc_transport.py", line 91, in create_channel
  |  address, credentials=credentials, scopes=cls._OAUTH_SCOPES
  | File "C:\Users\{user}\AppData\Local\Continuum\anaconda3\lib\site-packages\google\api_core\grpc_helpers.py", line 177, in create_channel
  |  credentials, _ = google.auth.default(scopes=scopes)
  | File "C:\Users\{user}\AppData\Local\Continuum\anaconda3\lib\site-packages\google\auth\_default.py", line 317, in default
  |  raise exceptions.DefaultCredentialsError(_HELP_MESSAGE)
  |google.auth.exceptions.DefaultCredentialsError: Could not automatically determine credentials. Please set GOOGLE_APPLICATION_CREDENTIALS or explicitly create credentials and re-run the application. For more information, please see https://cloud.google.com/docs/authentication/getting-started

-----
原因
外部のプログラムから GoogleAPI で Google アカウントのリソースにアクセスするためには、Google のサービスアカウントで OAuth2 の認証が必要
その為の GCP サービスアカウントキーの作成 GOOGLE_APPLICATION_CREDENTIALS を設定していないから
簡単に言うと
アプリケーションがプログラムにより Google サービスにアクセスするために使用できる特別な Google アカウント
-----
対処
1. サービスアカウントキーを作成する
  GCP管理コンソール > APIとサービス > 認証情報 > 認証情報を新規作成 > サービスアカウントキー
  https://console.cloud.google.com/apis/credentials/serviceaccountkey
2. 諸項目の入力
  サービスアカウント名: My Service Account
  役割: Project > Owner // bucket操作も見据えて
  キーのタイプ: JSON
3. キーファイル (秘密鍵ファイル) をローカルに保存
  C:\credentials\google\GOOGLE_APPLICATION_CREDENTIALS\My Project-{xxx}.json
4. 環境変数に設定する
  コントロール パネル\ユーザー アカウント\ユーザー アカウント > 環境変数の変更
  ユーザー環境変数 > 新規
  変数名: GOOGLE_APPLICATION_CREDENTIALS
  変数値: C:\credentials\google\GOOGLE_APPLICATION_CREDENTIALS\My Project-{xxx}.json
5. 新規コマンドプロンプトでコマンド再実行
  // 新規プロセスでないと環境変数の変更が反映されない

Ref.
Google Natural Language API使って自然言語処理して内部リンク自動生成してみた。
https://www.aozora-blog.com/2018/12/12/post-1122/
Google Cloud Platform のサービスアカウントキーを作成する
https://www.magellanic-clouds.com/blocks/guide/create-gcp-service-account-key/
Getting Started with Authentication
https://cloud.google.com/docs/authentication/getting-started
Setting Up Authentication for Server to Server Production Applications
https://developers.google.com/accounts/docs/application-default-credentials

tag : Python GCP UnicodeDecodeError cp932 INVALID_ARGUMENT encodingType classifyText ModuleNotFoundError PackagesNotFoundError Anaconda

2019-07-09 23:08 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] Google Natural Language API に触ってみる

Tag: Cloud AutoML , Google Cloud Platform , AutoML Vision , AutoML Natural Language , AutoML Translation , AutoML Tables , AutoML Video , AutoML Vision Edge , custom entity extraction , custom sentiment analysis , Cloud Natural Language API GCP


自然言語とは
  普段人間が使用している言語

自然言語処理とは
  自然言語をコンピュータ処理させること

自然言語処理の特徴とは
  機械学習
  英語版
    文章の単語分割
    クリーニング処理 (カンマなどの排除)
    単語の正規化
    省略語処理 (Mr.の補正)
    stemming処理 (活用形の変換)
    Stop-words処理
    単語の確立表現 (N-grams処理)
    単語のベクトル変換
  日本語版
    形態素解析
    構文解析
    意味解析
    文脈解析

Google の自然言語処理 - 2種類
  Cloud Natural Language
    Googleが提供する自然言語処理の機械学習モデル
    テキストの構造と意味を解析できる
  AutoML Natural Language
    独自にデータ噛ましてモデルを改修できる

Cloud Natural Language
  https://console.cloud.google.com/home/
  左上のハンバーガーメニュー
  APIとサービス > ダッシュボード

  出来ること
    感情分析
    エンティティ分析
    エンティティ感情分析
    構文解析
    コンテンツ分類

  動作サンプル
    https://cloud.google.com/natural-language/?hl=ja

  Ref.
  Googleクラウド自然言語APIを使ってみた
  https://qiita.com/howdy39/items/a1aef86fef1ce1b6d778

AutoML Natural Language ダッシュボード
  https://console.cloud.google.com/home/
  左上のハンバーガーメニュー
  下の方にある
  人工知能 > Natual Language
  をクリック

------------------------------
REST で Cloud Natural Language API を呼ぶ

Ref.
Cloud Natural Language API で飲食店レビューの感情を分析する
http://iti.hatenablog.jp/entry/2019/02/21/095135
第0回 Google Cloud Platformをはじめよう! アカウント登録~画像認識APIを試してみよう
https://book.mynavi.jp/manatee/detail/id=65673

Preparation
- Install Chrome Postman
- GCP Console プロジェクトをセットアップ
  GCP コンソールにログイン
  https://console.cloud.google.com/
  GCP プロジェクトを作成
  GCP Console>Cloud Shell を無駄に実行してみる
    SDK, editor, build tool, git, dockerなどがインストール済みらしい
  APIの有効化
    GCP Console>APIとサービス>ライブラリ>Cloud Natural Language API>Content Classification Operations>有効にする
    // ココでGCP利用登録 - 回避不能
    // 登録画面本家: https://cloud.google.com/free/
    APIを有効にする
  APIキーの発行
    APIとサービス > 認証情報 > 認証情報を作成 > APIキー
    キーを制限 > (デフォルトのまま)保存

Experiment #01 - from API Exploer
  GCP Console > APIとサービス > ライブラリ > Cloud Natural Language API > 管理 = API Exploer
  Cloud Natural Language API > API Exploer > チュートリアルとドキュメント > API Exploer で試す
  利用できるAPIの一覧が表示されるので試すAPIを選択
    Services > Cloud Natural Language API v1
    language.documents.analyzeEntities
  fields: blank
  Request body:
    |{
    |  "document": {
    |    "type": "PLAIN_TEXT",
    |    "language": "ja",
    |    "content": "昨日のうどんはとてもおいしかった。今度はひやひやも試してみよう。"
    |  }
    |}
  Execute
  POST https://language.googleapis.com/v1/documents:analyzeEntities?key={APIKey}
  Response Body:
    |200
    |
    |- Show headers -
    | 
    |{
    | "entities": [
    | {
    |  "name": "うどん",
    |  "type": "CONSUMER_GOOD",
    |  "metadata": {
    |  },
    |  "salience": 0.7087962,
    |  "mentions": [
    |  {
    |   "text": {
    |   "content": "うどん",
    |   "beginOffset": -1
    |   },
    |   "type": "COMMON"
    |  }
    |  ]
    | },...

Experiment #02-02 - from Postman - PLAIN_TEXT を JSON で (エンティティ分析)
  URL: POST https://language.googleapis.com/v1/documents:analyzeEntities?key={APIKey}
  Request Body (raw):
    |{
    | "document": {
    |  "type": "PLAIN_TEXT",
    |  "content": "Google、クラウド自然言語APIを公開―英語、日本語、スペイン語に対応"
    | },
    | "encodingType": "UTF8"
    |}
  SEND
  Response Body:
    |{
    |  "entities": [
    |    {
    |      "name": "語",
    |      "type": "OTHER",
    |      "metadata": {},
    |      "salience": 0.26045963,
    |      "mentions": [
    |        {
    |          "text": {
    |            "content": "語",
    |            "beginOffset": 51
    |          },
    |          "type": "COMMON"
    |        },...

Experiment #02-02-02 - from Postman - PLAIN_TEXT を JSON で (コンテンツ分類)
  URL: POST https://language.googleapis.com/v1/documents:classifyText?key={APIKey}
  Request Body (raw):
    |{
    | "document": {
    |  "type": "PLAIN_TEXT",
    |  "content": "The Google Cloud Natural Language API supports a variety of languages. These languages are specified within a request using the optional language parameter. Language code parameters conform to ISO-639-1 or BCP-47 identifiers. If you do not specify a language parameter, then the language for the request is auto-detected by the Natural Language API."
    | }
    |}
  SEND
  Response Body:
    |{
    |  "categories": [
    |    {
    |      "name": "/Computers & Electronics",
    |      "confidence": 0.63
    |    }
    |  ]
    |}
  Ref.
  Googleクラウド自然言語APIを使ってみた
  https://qiita.com/howdy39/items/a1aef86fef1ce1b6d778


//fighting: Experiment #02-03 - from Cloud SDK - PLAIN_TEXT を JSON で
  Cloud SDK の準備
    ref. https://cloud.google.com/sdk/docs/quickstart-windows?hl=ja
    Google Cloud SDK のインストーラをダウンロードして実行
    インストールされると勝手にCMD立ち上がりgcloud initが実行される
    仰せのままにログイン
    To continue, you must log in. Would you like to log in (Y/n)? Y  
    リソースマネージャーでプロジェクト確認して
    https://console.cloud.google.com/cloud-resource-manager
    実行ずるプロジェクトをCMDから選択
    試し打ち
      gcloud auth list
    Google Cloud Shell で Quick Study
      https://cloud.google.com/shell/docs/tutorials
      https://console.cloud.google.com/cloudshell/editor
      To set your Cloud Platform project in this session use “gcloud config set project [PROJECT_ID]”
      |user@cloudshell:~$ gcloud projects list --format=json \
      |>   --limit=1
      |[
      | {
      |  "createTime": "2018-06-11T14:50:35.140Z",
      |  "lifecycleState": "ACTIVE",
      |  "name": "My Project",
      |  "projectId": "XXX",
      |  "projectNumber": "XXX"
      | }
      |]
      |user@cloudshell:~$ gcloud projects list \
      |>   --format=flattened --limit=1
      |---
      |createTime:   2018-06-11T14:50:35.140Z
      |lifecycleState: ACTIVE
      |name:      My Project
      |projectId:   XXX
      |projectNumber: XXX
      |user@cloudshell:~$
      |user@cloudshell:~$
      |user@cloudshell:~$ gcloud projects list \
      |>   --format="table[box,title=Projects](name, \
      |>   lifecycleState)"
      |┌───────────────────────────────────┐
      |│       Projects       │
      |├─────────────────┬─────────────────┤
      |│    NAME   │ LIFECYCLE_STATE │
      |├─────────────────┼─────────────────┤
      |│ My Project   │ ACTIVE     │
      |│ uq-us-project-1 │ ACTIVE     │
      |└─────────────────┴─────────────────┘
      |user@cloudshell:~$
      |user@cloudshell:~$
      |user@cloudshell:~$
      |user@cloudshell:~$ gcloud projects list \
      |>   --format="csv[no-heading,separator=' \
      |>   '](name, lifecycleState)"
      |My Project   ACTIVE
      |uq-us-project-1   ACTIVE
  Request01/cloudshell:
    |curl -X POST \
    |   -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
    |   -H "Content-Type: application/json; charset=utf-8" \
    |   --data "{
    |  'encodingType': 'UTF8',
    |  'document': {
    |  'type': 'PLAIN_TEXT',
    |  'content': 'President Trump will speak from the White House, located at 1600 Pennsylvania Ave NW, Washington, DC, on October 7.'
    | }
    |}" "https://language.googleapis.com/v1/documents:analyzeEntities"
  Response01/cloudshell:
    |{
    | "error": {
    |  "code": 403,
    |  "message": "Your application has authenticated using end user credentials from the Google Cloud SDK or Google Cloud Shell which are not supported by the language.googleapis.com. We recommend that most server applications use service accounts instead. For more information about service accounts and how to use them in your application,see https://cloud.google.com/docs/authentication/.",
    |  "status": "PERMISSION_DENIED"
    | }
    |}
  Request02/cloudshell:
    |curl -X POST \
    |   -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
    |   -H "Content-Type: application/json; charset=utf-8" \
    |   --data "{
    |  'encodingType': 'UTF8',
    |  'document': {
    |  'type': 'PLAIN_TEXT',
    |  'content': 'President Trump will speak from the White House, located at 1600 Pennsylvania Ave NW, Washington, DC, on October 7.'
    | }
    |}" "https://language.googleapis.com/v1/documents:analyzeEntities?key={APIKey}"
  Response02/cloudshell:
    |{
    | "error": {
    |  "code": 400,
    |  "message": "The API Key and the authentication credential are from different projects.",
    |  "status": "INVALID_ARGUMENT",
    |  "details": [
    |   {
    |    "@type": "type.googleapis.com/google.rpc.Help",
    |    "links": [
    |     {
    |      "description": "Google developer console API key",
    |      "url": "https://console.developers.google.com/project/XXX/apiui/credential"
    |     }
    |    ]
    |   }
    |  ]
    | }
    |}
  一旦ギブアップ。。

//failed: Experiment #02-01 - from Postman
  URL: POST https://language.googleapis.com/v1/documents:analyzeEntities
  Request Body (raw):
    |{
    | "document": {
    |  "type": "PLAIN_TEXT",
    |  "content": "Google、クラウド自然言語APIを公開―英語、日本語、スペイン語に対応"
    | },
    | "encodingType": "UTF8"
    |}
  SEND
  Response Body:
    |{
    |  "error": {
    |    "code": 403,
    |    "message": "The request is missing a valid API key.",
    |    "status": "PERMISSION_DENIED"
    |  }
    |}

Experiment #03 - gcsContentUri
  gcsContentUri で渡す場合は、Google Cloud Storage 内のテキストコンテンツを指定する
  GCS
    Cloud Storage URI は、バケット名とオブジェクト(ファイル名)で構成される
    Cloud Storage バケットの名前が mybucket で、データファイルの名前が myfile.csv の場合、バケットの URI は gs://mybucket/myfile.csv になる
    URI にワイルドカードも使用できる
    Google Drive Storage は利用者向けで Google Cloud Storage は開発者向け
    ref. https://cloud.google.com/storage/docs/
    無料トライアル期間後も5 GBまでは無料
    ref. https://cloud.google.com/storage/docs/creating-buckets
    バケツを作る
      https://console.cloud.google.com/storage/
      バケットを作成 // 名前を指定し他は全部デフォルトで作成
    フォルダ切ってファイルをアップロード
    アップロードしたオブジェクトを選択してURIを取得
    gs://my-bucket-001/test_20190709/dummyData.txt
    

//failed: Experiment #03-01 - gcsContentUri
  背景
    やはりバケットへの認証が必要ぽい
    gcloud auth activate-service-account --key-file=service-account-key-file
    その為にはどうやらGoogle Cloud SDKが必要らしい
  Postman
  URL: POST https://language.googleapis.com/v1/documents:analyzeEntities
  Request Body (raw):
    |{
    | "document": {
    |  "type": "PLAIN_TEXT",
    |  "gcsContentUri": "gs://my-bucket-001/test_20190709/dummyData.txt"
    | },
    | "encodingType": "UTF8"
    |}
  SEND
  Response Body:
    |{
    |  "error": {
    |    "code": 401,
    |    "message": "Permission to access the GCS address is denied.",
    |    "status": "UNAUTHENTICATED",
    |    "details": [
    |      {
    |        "@type": "type.googleapis.com/google.rpc.BadRequest",
    |        "fieldViolations": [
    |          {
    |            "field": "document.gcs_content_uri",
    |            "description": "Permission to access the GCS address is denied."
    |          }
    |        ]
    |      }
    |    ]
    |  }
    |}



------------------------------
Cloud Natural Language API
Ref.
入門ガイド
https://cloud.google.com/natural-language/docs/how-to?hl=ja
Cloud Natural Language API ドキュメント
https://cloud.google.com/natural-language/docs/?hl=ja
コンセプト: Natural Language API の基本
https://cloud.google.com/natural-language/docs/basics?hl=ja
クイックスタート
https://cloud.google.com/natural-language/docs/quickstarts?hl=ja
チュートリアルとサンプル アプリケーション
https://cloud.google.com/natural-language/docs/tutorials?hl=ja

tag : GCP Cloud AutoML , Google Platform Vision Natural Language Translation

2019-07-09 22:50 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] Windows で Python を実行する

Tag: Python Windows Python Anaconda Google Colab pip conda Linux Vagrant

■ 結論
自分一人で遊ぶなら Anaconda (方法2)
チームでやるなら 共有が容易いGoogle Colab (方法3)

■ 方法1 - 自力でチマチマとインストール
Abs
  Python本体をインストールして
  諸々ライブラリを良しなにインストール

Python本体のInstall
  https://www.python.org/downloads/windows/
  Python 3.7.3 - March 25, 2019
  Download Windows x86-64 executable installer
  kickpython-3.7.3-amd64.exe
  check 'Add Python to PATH'

インストール結果確認
  // no reboot required
  Pythonインタプリンタを起動させる
  | C:\Users\{user}>py
  | Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32
  | Type "help", "copyright", "credits" or "license" for more information.
  | >>>

Ref.
The Python Tutorial
  https://docs.python.org/3.7/tutorial/index.html


■ 方法2 - All-in-oneでインストール
Abs
  通常はpython本体の他にライブラリ(パッケージ)のインストールが必要
  Anaconda
    python本体と諸々ライブラリを一緒にインストールできるディストリビューション
    Windows、Mac、Linuxの3バージョン

Install
  https://www.anaconda.com/distribution/
  Python 3.7 version
  kick Anaconda3-2019.03-Windows-x86_64.exe
  check 'Add Anaconda to my PATH
  check Register Anaconda as my default Python

インストール結果確認
  | C:\Users\{user}>python --version
  | Python 3.7.3
  | C:\Users\{user}>
  
  Pythonインタプリンタを起動させる
  | C:\Users\{user}>python
  | Python 3.7.3 (default, Mar 27 2019, 17:13:21) [MSC v.1915 64 bit (AMD64)] :: Anaconda, Inc. on win32
  | Warning:
  | This Python interpreter is in a conda environment, but the environment has
  | not been activated. Libraries may fail to load. To activate this environment
  | please see https://conda.io/activation
  | Type "help", "copyright", "credits" or "license" for more information.
  | >>>

conda
  Pythonにはpipというパッケージマネージャがある
  Anacondaには独自のパッケージマネージャである「conda」がある
  いろいろ出来る
    インストール済みのパッケージを表示 - cmd> conda list
    パッケージの検索 - conda search {package name}
    パッケージのインストール - conda install {package name}

Ref.
Getting started with Anaconda
http://docs.anaconda.com/anaconda/user-guide/getting-started/


■ 方法3 - グーグル・コラボ
Abs
  Google Colab
  Google Colaboratory
  グーグル・コラボ
  クラウド機械学習開発環境

Detail
  Google Colabの知っておくべき使い方 – Google Colaboratoryのメリット・デメリットや基本操作のまとめ
  https://www.codexa.net/how-to-use-google-colaboratory/
  Google Colabの使い方まとめ
  https://qiita.com/shoji9x9/items/0ff0f6f603df18d631ab


■ 方法4 - 仮想環境を構築してLinux風にインストール
Abs
  Windows Subsystem for Linux(WSL) や Vagrant なりで Linux を構築



ローカル開発環境の構築 [Windows編] (全14回)
http://dotinstall.com/lessons/basic_localdev_win_v2
ローカル開発環境の構築 [macOS編] (全14回)
http://dotinstall.com/lessons/basic_localdev_mac_v2
UNIXコマンド入門 [一般ユーザー編] (全24回)
https://dotinstall.com/lessons/basic_unix_v2
Python 3入門
https://dotinstall.com/lessons/basic_python_v3


■ ハローワールド
1. hello.py を作成
2. 以下を入力して保存
  print("Hello World!")
  // NG: print(“Hello World!”) --> SyntaxError: invalid character in identifier
3. Terminal/CommandPromptで同ファイルを保存したとこまで change directory
4. Python hello.py で実行
結果
| C:\{hoge}\Python hello.py
| Hello World!


■ IDEのインストール
Pycharm
ref.
PyCharm のオレオレ最強設定
https://akiyoko.hatenablog.jp/entry/2017/03/10/082912



Ref.
Pythonをインストールする(for Windows), Qiita
https://qiita.com/taiponrock/items/f574dd2cddf8851fb02c
Windows 環境のPython
https://www.python.jp/install/windows/index.html
https://www.python.jp/install/windows/install_py3.html
Pythonの実行方法
https://www.python.jp/install/windows/py_launcher.html
ディストリビューション「Anaconda」とは?
https://programming-study.com/trouble/anaconda/
WindowsでPython 開発環境構築 『Hello World!』を出力
https://www.youfit.co.jp/archives/1805

tag : Python Windows Anaconda Google Colab pip conda Linux Vagrant

2019-07-09 22:41 : 開発 : コメント : 0 : トラックバック : 0 :

Amazon S3 のアクセスコントロール

Amazon S3 のアクセスコントロール
大きく3種類
ACL(Document)
  -- Access Control List
  -- バケット/オブジェクトのサブリソースとしてXMLで定義する。
  -- 更に2種類に分類される > BucketACL, ObjectACL
BucketPolicy(Document)
  -- バケット/オブジェクトのアクセス権をJSONで定義する。
IAM(Document)
  -- IAMのリソースに紐づき、S3を含むAWSリソースへのアクセス権をJSONで定義する
  -- 更に3種類に分類される > Groups, Users, Roles


>>> 基本的に使用するのは BucketPolicyIAM で良い。
// ACL は歴史的に古くからあっただけのものぽいから
// ACL より BucketPolicy のが基本強いから

>>> IAMポリシーとバケットポリシーはどちらでも同じようなアクセス権を設定できるが、
ユーザにアクセス権を設定したい場合はIAMポリシーを使い、
AWSアカウントやバケットにアクセス権を設定したい場合はバケットポリシーを使う、
という決まりを作ったほうが運用時に幸せになれそう。


対象リソースの指定
  -- bucket policyでactionを制限する場合の対象はARN
  -- バケツに対するARN: arn:aws:s3:::bucket
  -- オブジェクトに対するARN: arn:aws:s3:::bucket/*

権限不要で必要な被付与者(Grantee)情報
  -- AWS Account ID
  -- Canonical User ID (正規ユーザー ID)
  -- Your Security Credentials のページの Account Identifiers で確認はできる
  -- もしくはコマンドで 「aws s3api get-bucket-acl --bucket


ref.
チュートリアル例: Amazon S3 リソースへのアクセスの管理
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/example-walkthroughs-managing-access.html
クロスアカウント
https://qiita.com/ryo0301/items/791c0a666feeea0a704c#%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88

tag : Amazon AWS S3 Bucket ACL IAM Policy

2019-03-19 08:39 : 開発 : コメント : 0 : トラックバック : 0 :

[開発][Python] 開発標準の話 ー 可読性て大切

Python にもちゃんと Javadoc なものがある。




ref.

[Python]可読性を上げるための、docstringの書き方を学ぶ(NumPyスタイル)
https://qiita.com/simonritchie/items/49e0813508cad4876b5a

tag : Python

2018-06-14 07:03 : 開発 : コメント : 0 : トラックバック : 0 :

[開発][DB][MySQL] データ更新で接続エラーになる

■ 事象
MySQL server has gone away
ER_NET_PACKET_TOO_LARGE

■ 原因
許容データ量オーバー

■ 確認
mysql> show variables like 'max_allowed_packet';

■ 詳細
The largest possible packet that can be transmitted to or from a MySQL 8.0 server or client is 1GB.

When a MySQL client or the mysqld server receives a packet bigger than max_allowed_packet bytes, it issues an ER_NET_PACKET_TOO_LARGE error and closes the connection. With some clients, you may also get a Lost connection to MySQL server during query error if the communication packet is too large.
shell> mysql --max_allowed_packet=32M
shell> mysqld --max_allowed_packet=128M

ref.
B.5.2.9 Packet Too Large
https://dev.mysql.com/doc/refman/8.0/en/packet-too-large.html

tag : max_allowed_packet DB MySQL ER_NET_PACKET_TOO_LARGE

2018-04-30 13:50 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] AWS の CLI を叩く

tag. AWS S2 CLI aws s3

ローカルマシンでAWS CLIを実行するには、以下の4つの情報が必要
- アクセスキー
- シークレットアクセスキー
- 接続先のAWSリージョン
- 出力フォーマット

-----------------------------------

バケットにオブジェクトを転送
aws s3 cp sample.txt s3://sample.bucket

ローカルからS3にコピー
aws s3 cp
S3からローカルにコピー
aws s3 cp
S3からS3にコピー
aws s3 cp
ディレクトリを再帰的にコピー
aws s3 cp bar/ s3://workbt/ --recursive
aws s3 cp bar s3://workbt/ --exclude "*" --include "*.txt" --recursive
aws s3 cp bar s3://workbt/ --exclude "*" --include "*.txt" --include "*.jpg" --recursive


ローカルからS3に移動
aws s3 mv test1.txt s3://workbt/hoge/
S3からローカルに移動
aws s3 mv s3://workbt/hoge/test1.txt ./
S3からS3に移動
aws s3 mv s3://workbt/hoge/test1.txt s3://workbt/fuga/


ファイルをローカルに落として開く
aws s3 cp s3://bucket_name/file.txt .
cat file.txt

ファイルをリモートから直接開く
aws s3 cp s3://bucket_name/file.txt -
aws s3 cp s3://bucket_name/file.txt - | less


バケットのオブジェクトを削除
aws s3 rm s3://sample.bucket/sample.txt

バケットのオブジェクト一覧を取得
aws s3 ls
aws s3 ls s3://sample.bucket

バケットのオブジェクト一覧を再帰的に取得
aws s3 ls workbt --recursive


色々ヘルプ
aws help
aws s3 help


ref.
AWS CLIのS3コマンドまとめ
http://www.task-notes.com/entry/20150904/1441335600
AWS CLIを使ってコマンドラインからAWSを操作する
http://tiro105.hateblo.jp/entry/2015/05/29/000809
aws s3コマンドでs3上のファイルをcatする裏技
https://chat-rate.com/it/3230/

tag : AWS S2 CLI aws s3

2018-03-16 23:56 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] 暗号に使用される塩 - SALT


tag. hash sha1 md5 salt encryption decryption SALT

user の password などは DB などに保存して置くのが一般的
password を平文で DBに保存して置くと、
DB に access できる保守運用者などに情報が筒抜け。
何かの拍子に情報が流出する恐れもある

なので、
DB に保存する password などの個人情報は、ハッシュ化してから DB に保存する
ハッシュ化された文字列だけでは、基本、複合化(復元)できない。
しかし、

ハッシュ化方法は md5sha1 など複数ある
ありがちな password は、すでに 平文とhash化された文字列の対応が解析されている。
プラス、レインボーテーブルといったテクニックで元の平文を復元される可能性もある。
そこで、SALT

元の平文に余計な文字列を付け足してからハッシュすることで、
よくあるハッシュ文字列になることを避けることでセキュリティを上げるというもの。
この余計な文字列を SALT という。


ref.
パソコンなどの「暗号」において 「塩」「ソル
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12146344492

tag : hash sha1 md5 salt encryption decryption SALT

2018-02-16 22:07 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] LZO という Redshift の圧縮エンコード

tag.
LZO lzo Amazon Redshift type compression distkey sortkey constraint

Amazon Redshift でのテーブル定義の要素は 以下の5つ
その内、2 ~ 3 が Redshift 特有のもの。

1.データの型(data types)
2.列圧縮タイプ(column compression types)
3.分散キー(distkey)
4.ソートキー(sortkey)
5.制約(constraint)

LZO エンコードは、列圧縮タイプ の1つで、非常に高い圧縮率と良好なパフォーマンスを実現するんだそうだ

ref.
Amazon Redshift データ型と列圧縮タイプのまとめ(データ型&列圧縮タイプ対応表付)
https://dev.classmethod.jp/cloud/aws/amazon-redshift-data-types-and-column-compression-types/

tag : LZO lzo Amazon Redshift type compression distkey sortkey constraint

2018-02-13 20:40 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] Python 入門 - とりあえず意気込みだけ

Python入門編1:プログラミングを学ぶ
https://paiza.jp/works/python3/primer/beginner-python1

paiza.io
https://paiza.io/ja/projects/new

Python入門 サンプル集
https://algorithm.joho.info/programming/python/sample-code-py/

Python入門
https://www.pythonweb.jp/tutorial/

tag : Python paiza tutorial sample

2018-02-12 23:04 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] Luigi - データフロー制御フレームワーク -Pythonベース

Luigi Python dataflow flamework Spotify bigdat

Luigi
ルイージ
Pythonで書かれたデータフロー制御フレームワーク
Spotifyが開発
batch dat aprocessing in Python
データのクレンジングやフィルタ処理を容易にするもの
HadoopやTreasure Dataとも相性良い

リポジトリ
https://github.com/spotify/luigi

ref.
データフロー制御フレームワークLuigiを使ってビッグデータ解析をする
https://qiita.com/colspan/items/453aeec7f4f420b91241
Python: データパイプライン構築用フレームワーク Luigi を使ってみる
http://blog.amedama.jp/entry/2017/05/13/203907
Luigi によるワークフロー管理
https://qiita.com/k24d/items/fb9bed08423e6249d376
Luigiでデータ処理をきれいに書こう
https://www.rco.recruit.co.jp/career/engineer/blog/akiba-python-luigi-01/
Luigi で作成するワークフローの再利用性・メンテナンス性を高めるために
https://qiita.com/ngr_t/items/b928bc13457571e25519
Hello Worldタスクを作ってみた | Luigi Advent Calendar 2016 #01
https://dev.classmethod.jp/tool/advent_calendar_2016_luigi_12_1_helloworld/

tag : Luigi Python dataflow flamework Spotify bigdat

2018-01-04 09:04 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] PHP/Ruby用ローカル開発環境の構築 [Windows編] - Vagrant, VirtualBox

## VirtualBox - install
## Vagrant - install

## 流れ - サーバ設定/VM起動
Vagrantfileでserverの設定を読み込みVirtualBoxを立ち上げる

1 server - 1 folder
Windows
|-- MyVagrant
|    |-- MyCentOS
|    |    |-- Server1 >> setting @Vagrantfile - e.g. 192.168.33.10
|    |-- MyProject
|    |    |-- Server2 >> setting @Vagrantfile - e.g. 192.168.33.11
|

WindowsのPowerShellでコマンドを入力する
Windows + s >> PowerShell
vagrant plugin install vagrant-vbguest

mkdir MyVagrant
cd MyVagrant
mkdir MyCentOS
cd MyCentOS
vagrant init bento/centos-6.8

// Vagrantfile ----------
config.vm.network "private_network", ip: "192.168.33.10"
---------- Vagrantfile //
vagrant up
vagrant status
exit

## PuTTY - パティ
install

## VMへの接続
PuTTY
- IP : 192.168.33.10
- Connection Type : SSH
- Saved Sessions : MySentOS >> Save
>> Open

login as: vagrant
vagrant@192.168.33.10's password: vagrant
[vagrant@localhost ~]$

## VMの初期設定
# OSのアップデート
sudo yum -y update
# スクリプトを入手するためのgitのインストール
sudo yum -y install git
# gitでアプリケーション設定用のスクリプトのダウンロード
git clone https://github.com/dotinstallres/centos6.git
# centos6フォルダに移動
cd centos6
# スクリプトの実行
./run.sh
# もろもろの設定を反映
exec $SHELL -l

## ファイル転送ソフト
cyberduck >> install

## hosts - 特定IPに名前を付ける

ref.
ローカル開発環境の構築 [Windows編] (全14回)
http://dotinstall.com/lessons/basic_localdev_win_v2

tag : PHP Ruby Vagrant VirtualBox CentOS PowerShell cyberduck hosts

2018-01-04 08:42 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] Python で Hello World

Python

1991年に登場したプログラミング言語
- フリーソフト/オープンソース/simple/取得容易/オブジェクト指向/クロスプラットフォーム
- データ解析、機械学習にも用いられている
https://www.python.org
https://docs.python.org/3/
https://www.python.jp

$ python -v
Python 3.5.2
$ pwd
/home/vagrant/python_lessons
$ touch myapp.py
$ vi myapp.py

// myapp.py ----------
# 行末のセミコロンは省略可
print("Hello World")

'''
複数行のコメント方法:
シングル/ダブルクオーテーション3つで囲む
'''
---------- myapp.py //

$ python myapp.py
Hello World

// myapp.py ----------
# 変数 - 値の再代入可能
msg = "Hello World"
print(msg)
msg = "Hello Again"
print(msg)

# 定数 - 値の再代入不可
# 慣習的ルールで実際は再代入可能
ADMIN_EMAIL = "account@domain.com"

# 文字列
charLine = "he\nllo" + "wor\tld"
charLines = """


print(charLine)
print(charLines)

# 数値
i = 12
f = 34.5

# 論理値
flag = True # False

# データ演算
x = 10
pring(x / 3) # 3.33..
pring(x // 3) # 3..
pring(x % 3) # 1
pring(x ** 2) # 100

y = 4
y += 12
print(y) # 16

print(True and False) # False
print(True or False) # True
print(not True) # False

print("hello " * 3) # hello hello hello
---------- myapp.py //

ref.
Python 3入門 (全31回)
https://dotinstall.com/lessons/basic_python_v3

tag : Python

2018-01-04 08:05 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] Git環境の構築 - GitBashのインストール

Git Quick Reference
git --version
git config --global user.name "sample name"
git config --global user.email sample@example.com
git config --list
git init
git status
git add
git commit -m "first commit"
git log


■ 詳細
以下より「Git SCM to Windows」をDL
http://gitforwindows.org
全てデフォルトのままでインストール実行

Git Bash とは
Windowsのコマンドプロンプトでgit操作する為のツール(ターミナル)
Git for Windows」がインストールできていれば使用可能になる

■ Linuxな基礎操作
$ echo ~ ホームディレクトリの表示
$ ls 現在のディレクトリの表示
$ cd xxx/xxx xxx/xxxディレクトリへの移動
$ cd ../ 一つ上のディレクトリへ移動
$ mkdir ディレクトリの作成
$ mv hoge.txt foo/boo foo/booディレクトリにhoge.txtを移動する
$ cp hoge.txt newhoge.txt hoge.txtを複製しnewhoge.txtという名にする
$ touch new.txt new.txtというファイルを作成する
$ rm old.txt old.txtというファイルを削除する

Gitな基礎設定
コミットする際に使うユーザ名とメールアドレスの設定
$ git config --global user.name "sample name"
$ git config --global user.email sample@example.com
これでホームディレクトリに「.gitconfig」というファイルができる

SSHキーの作成
BitbucketやGitHubなどのリモートリポジトリを利用する場合は、安全に通信を行うためにSSHでの接続を行うのが良い
Git BashからSSHキーを発行し、各サービスと連携しておく
詳細割愛
ref.
https://www.granfairs.com/blog/staff/gitbash-ssh
https://www.granfairs.com/blog/staff/ssh-passphrase

Git Bashを見やすくする
割愛..


ref.
WindowsにGitをインストールする
https://www.granfairs.com/blog/cto/install-git-for-windows
WindowsでGitを始めたらまず確認!Git Bashの設定&ショートカット
https://www.granfairs.com/blog/staff/gitbash-setting-shortcut
初心者でもWindowsやMacでできる、Gitのインストールと基本的な使い方 (2/5)
http://www.atmarkit.co.jp/ait/articles/1603/31/news026_2.html

tag : Git GitBash

2017-12-27 09:00 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] Activitiとは

Activitiとは
- BPMエンジン(ワークフローエンジン)
- Activiti BPM Platform
- オープンソース(Apache License, Version 2.0) = 無償利用可能
- BPMN2.0ネイティブ対応
- Alfresco社がスポンサー

Activiti Modeler - Webベースのモデリングツール
Activiti Designer - Eclipseプラグインとして使用するモデリングツール
Activiti Explorer - ワークフローWebアプリケーション(ActivitiのWebフロントエンド)。簡単な申請画面等を作成できる。
★ 実際利用する場合は別途Webアプリケーションを作成し、ワークフロー・エンジンとしてactivitiを使用する


ref.
Activiti BPM Platformことはじめ(インストール方法とか)
http://labo-blog.aegif.jp/2013/06/activiti-bpm-platform.html

tag : Activiti BPM BPMN Modeler Designer Explorer

2017-11-30 15:16 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] 業務モデリング手法の話

[開発] 業務モデリング手法の話

tag. BPMN CMMN DMN OMG

BPM(Business Process Management)
BPMN(Business Process Modeling Notation)
業務モデリング手法

EA(Enterprise Architecture)
PDCA(Plan/Do/Check/Act)
SOA(Service Oriented Architecture)
BPMI(Business Process Management Initiative)
OMG(Object Management Group)
BAM(Business Activity Monitoring)
BI(BusinessInterigence)
SCM(Supply Chain Management)
BPO(Business Process Outsourcing)

ITアーキテクト Vol.6
https://ja.scribd.com/doc/153908716/ITアーキテクト-Vol-6-00-pdf#

BPMN 2.0の概要とビジネス・プロセス・モデリング
https://thinkit.co.jp/story/2010/09/10/1757

tag : BPMN CMMN DMN OMG

2017-11-30 15:14 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] ActivitUserGuide の気になるとこを掻い摘んでを訳しただけ

ActivitUserGuide の気になるとこを掻い摘んでを訳しただけ

■ 解決したら万々歳なネタ
- Activiti terminology の全容と各定義
   Model, >> 座標情報付きのプロセス定義の下書き
   Deployment, 作成したプロセス定義のファイナライズ、公開/出版に同義
   ProcessDefinition, 完成したプロセス定義、公開/出版したもの
   ProcessInstance, 各プロセス定義(型)を基に生成される各プロセス
   Task, プロセスを構成する要素
   Execution, プロセスの現状を示すポインタ
   Comment, 次タスクに回す際に添えるコメント。一回使い捨てなので更新不可なオブジェクト
   Attachment, 添付資料
   Entity, DBに登録する1レコード
   IdentityLink, タスクと担当者/グループのリンク情報
   Group, ユーザのグループ
   User, ユーザ
   Job ジョブ。タイマー/スケジューラの管理対象となるコンポーネント

- model と definition の違い
   >> 仮説: 前者が描画表記のドラフト版、後者がXML表記の最終形
   >> 正解。
   repository/models/37/source を照会すると座標情報がある
   対し、repository/process-definitions は座標情報を含まない
   process modelしてデプロイまで完了すると、座標情報が削除されプロセス定義となる

- event の実態
   >> 仮説: 各アクションのこと?

- Execution と プロセスインスタンスの違い
   >> 仮説: 前者は単なるポインタ、後者は普通のインスタンス

- v6 での Activiti Explorerの在り処
   >> 仮説: もはや無い!

- サブプロセスやサブタスク と 親プロセス/タスク の住み分け

- テナントの概念

========================================
3. Configuration

----------------------------------------
3.17. Event handlers

指定の出来事(Event)がActivitiエンジンで発生した時に知らせるActivitiの1メカニズム
利用方法
-configurationにて engine-wide なイベントリスナを追加するか、
-API (RuntimeService) 使ってruntimeで engine-wide なイベントリスナを追加する

イベントは、org.activiti.engine.delegate.event.ActivitiEvent のサブクラスであること
イベントの種別(event type)は後述参照

3.17.6. Supported event types

ref.
org.activiti.engine.delegate.event.ActivitiEventType

Engine
 - ENGINE_CREATED
 - ENGINE_CLOSED
Entity
 - ENTITY_CREATED
 - ENTITY_INITIALIZED
 - ENTITY_UPDATED
 - ENTITY_DELETED
 - ENTITY_SUSPENDED
 - ENTITY_ACTIVATED
Job/Timer
 - JOB_EXECUTION_SUCCESS
 - JOB_EXECUTION_FAILURE
 - JOB_RETRIES_DECREMENTED
 - TIMER_FIRED
 - JOB_CANCELED
Activitiy
 - ACTIVITY_STARTED
 - ACTIVITY_COMPLETED
 - ACTIVITY_CANCELLED
 - ACTIVITY_SIGNALED
 - ACTIVITY_MESSAGE_RECEIVED
 - ACTIVITY_ERROR_RECEIVED
 - ACTIVITY_COMPENSATE
Xxx
 - UNCAUGHT_BPMN_ERROR
Variable
 - VARIABLE_CREATED
 - VARIABLE_UPDATED
 - VARIABLE_DELETED
Task
 - TASK_ASSIGNED
 - TASK_CREATED
 - TASK_COMPLETED
Process
 - PROCESS_COMPLETED
 - PROCESS_CANCELLED
Membership
 - MEMBERSHIP_CREATED
 - MEMBERSHIP_DELETED
 - MEMBERSHIPS_DELETED

Entity とは、Attachment, Comment, Deployment, Execution, Group, IdentityLink, Job, Model, ProcessDefinition, ProcessInstance, Task, User のこと
Comment の更新はない
suspend/activateは、ProcessDefinitions, ProcessInstances/Execution, Tasks に対してある
XXX activiti-rest 見るにJobsに対してあるような..

========================================

8. BPMN 2.0 Constructs

----------------------------------------
8.2. Events

イベントとはプロセスのライフタイムで生じる何かをモデルするもの
常に丸で表記される
BPMN2.0に於いては2種類のイベントがある

キャッチイベント
 プロセス実行(process execution)がイベントに到達すると、triggerの発生を待つ
 triggerの種別は定義にて宣言

スローイベント
 プロセス実行(process execution)がイベントに到達すると、triggerが着火される

8.2.1. Event Definitions

8.2.2. Timer Event Definitions

8.2.3. Error Event Definitions

8.2.4. Signal Event Definitions

8.2.5. Message Event Definitions

XXX モデル:「プロセス定義」をモデルする的な動詞として使われている??
XXX XMLの情報をプロセス定義、描画された情報をモデルと言っている? >> 全ての辻褄が合う
XXX Activitiの内部実装的にどう分けているのかがちょっと疑問。
XXX 定義途中のものがモデルでfinalizeするとプロセス定義になる的な?

----------------------------------------
8.5. Tasks

8.5.1. User Task

A user task is used to model work that needs to be done by a human actor.
When the process execution arrives at such a user task, a new task is created in the task list of the user(s) or group(s) assigned to that task.

期限
Each task has a field, indicating the due date of that task.

担当者 (User assignment = assignee)
Only one user can be assigned as human performer to the task.
In Activiti terminology, this user is called the assignee. Tasks that have an assignee are not visible in the task lists of other people and can be found in the so-called personal task list of the assignee instead.

特定ユーザに紐づくタスクの一覧 (personal task list)
|List tasks = taskService.createTaskQuery().taskAssignee("kermit").list();

candidate task listでも照会可能
|List tasks = taskService.createTaskQuery().taskCandidateUser("kermit");
ただし、その場合はpotentialOwnerが予め設定されていること (humanPerformer constructで宣言)
この場合は、グループ指定も可能 - 定義時にユーザなのかグループなのか明記すること(Activitiのデフォルトはグループ)
所属グループが担当候補の場合も表記照会で参照できる

Activiti extensions for task assignment
担当者要素

候補担当者要素

候補グループ要素


Custom Assignment via task listeners
イベント生成時にタスクリスナを仕掛けて担当者を割り当てることも可能

8.5.2. Script Task
スクリプトで動的に実行されるタスク

8.5.3. Java Service Task

8.5.4. Web Service Task

8.5.5. Business Rule Task

8.5.6. Email Task

8.5.7. Mule Task

8.5.8. Camel Task

8.5.9. Manual Task

8.5.10. Java Receive Task

8.5.11. Shell Task

8.5.12. Execution listener

8.5.13. Task listener

========================================

11. History

HistoricProcessInstances
HistoricVariableInstances
HistoricActivityInstances
HistoricTaskInstances
HistoricDetails

tag : Activiti BPM BPMN Task Model Process Execution

2017-11-30 15:09 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] The Activiti API - ActivitUserGuide Chap.4 を訳しただけ

[開発] The Activiti API - ActivitUserGuide Chap.4 を訳しただけ

----------------------------------------
4.1. The Process Engine API and services

Acitivitiを使用する場合、Engine APIを使用するのが最も一般的
その核となる始点が ProcessEngine
ProcessEngine の構築方法は複数あり > https://www.activiti.org/userguide/index.html#configuration

ProcessEngine を経由して様々がサービスを取得できる - workflow, BPM など
ProcessEngine と 紐づくサービスはいずれもスレッドセーフ

img: https://www.activiti.org/userguide/images/api.services.png
activiti.cfg.xml --> ProcessEngineConfiguration --> ProcessEngine
ProcessEngine --> RepositoryService, RuntimeService, TaskService, ManagementService, IdentityService, HistoryService, FormService

中略

サービスはすべてステートレスなので、クラスタ環境でも容易にActiviti実行可能
サービス間の依存性もなし

RepositoryService
Activitiエンジンを使用する上で最初に必要なるサービス
デプロイとプロセス定義を管理および操作するための操作を提供するもの
言うまでもなく、プロセス定義はBPMN 2.0対応のもの
デプロイ単位はActivitiエンジンを内包するパッケージ単位
1つのデプロイで複数のBPMN 2.0 XMLファイルと他のリソースを保持可能。開発者次第。

# デプロイとは、それらデプロイパッケージ(deployment)をエンジンにアップロードするということ
# デプロイで全ての情報はパースされデータベースに永続化される
# デプロイされて初めてシステムに公開したこととなり、プロセスの開始が可能となる

RepositoryService の仕事
- デプロイパッケージ(deployment)やプロセス定義の照会
- デプロイパッケージの一時停止・再開 (デプロイパッケージ全体に対してか各プロセス定義に対して)
  一時停止により再開するまで当該プロセスに対するいかなる操作も不能になる
- エンジンによって自動生成さえる、デプロイパッケージ(deployment)やプロセス図の関連リソースのリトリーブ
- XMLでなくJavaでのプロセス定義POJOのリトリーブ

RuntimeService
RepositoryService が基本的に更新のない静的情報を扱うのに対し、RuntimeService は逆に動的なものを扱う。
RuntimeService は、プロセス定義から新規にプロセスインスタンスを生成/開始させる。
# プロセス定義は、プロセスの各ステップの構造や挙動を定義したもの
# プロセスインスタンスは、プロセス定義の各実行(execution)
# プロセス定義の各プロセスインスタンスは同時に実行可能なもの

RuntimeService は、プロセス変数(process variables)のリトリーブや保管も担う
# プロセス変数(process variables)は、プロセスインスタンスに割り振れるもので、
# そのプロセスの様々なコンストラクタから参照・利用できる
# e.g. an exclusive gateway often uses process variables to determine which path is chosen to continue the process

プロセスインスタンスや実行(execution)の参照もRuntimeServiceで可能となる
# Executions are a representation of the 'token' concept of BPMN 2.0. Basically an execution is a pointer pointing to where the process instance currently is.

RuntimeService は、プロセスインスタンスが処理続行に必要な外部のトリガーを待機している際も使用される
# プロセスインスタンスは様々な待機状態(wait states)を持てる。- this service contains various operations to signal the instance that the external trigger is received and the process instance can be continued.

■ TaskService
タスクは、実際のユーザのアクションを必要とするもので、ActivitiなどのBPMエンジンにおける核である
以下のようなタスク周辺のものは全てTaskServiceに分類される。

― ユーザ/グループに割り振られたタスクの照会
― プロセスインスタンスに依存しないスタンドアローンなタスクの生成
― 当該タスクがどのユーザに割り振られてるのか、どのユーザが関与するのかを管理
― タスクのクレイム(タスクの横取り, claim)や完了
# Claiming means that someone decided to be the assignee for the task, meaning that this user will complete the task.
# Completing means doing the work of the tasks. Typically this is filling in a form of sorts.

■ IdentityService
ユーザやグループを作成、更新、削除、照会するサービス
Activiti は、runtimeで一切ユーザ検証をしていない。
=タスクは誰にも割り当てられるし、その割り当てられた担当者がシステムに入れるアカウントであるかの検証などしないということ
=Active Directoryなど他のサービスとLDAPで繋いてActivitiを使用することも可能

■ FormService
FormService は、任意のサービスで、Activiti は、FormService が無くても問題なく作動する。
開始フォーム(start form)とタスクフォーム(task form)がある
開始フォーム - プロセスインスタンスが開始される前にユーザに表示されるフォーム
タスクフォーム - タスクを完了させる際にユーザに表示されるフォーム (憶測込み、原文: a task form is the form that is displayed when a user wants to complete a form.)
フォームを使用する場合はBPMN2.0プロセス定義内にフォームを定義する。

■ HistoryService
Activitiエンジンが取集した履歴データを照会するサービス
プロセスインスタンスの開始時刻や、各タスクの実行者や所要時間

■ ManagementService
Activitiを使用して独自のアプリを実装する分には必要の無いサービス
ManagementService は、以下を担う
- DBのテーブルや、テーブルのメタデータのリトリーブ
- Jobの照会や管理操作
# Jobs are used in Activiti for various things such as timers, asynchronous continuations, delayed suspension/activation, etc.

■ DynamicBpmnService
再デプロイ無しにプロセス定義を部分的に変更できるサービス
任意のタスクの担当者を変えたり、サービスタスクのクラス名を変えたり等


----------------------------------------
4.2. Exception strategy

非検査例外 org.activiti.engine.ActivitiException が基底例外
プロセス実行やAPI実行で発生する ActivitiException を除くと以下のようなサブクラスを持つ
ActivitiWrongDbException
ActivitiOptimisticLockingException
ActivitiClassLoadingException
ActivitiObjectNotFoundException
ActivitiIllegalArgumentException
ActivitiTaskAlreadyClaimedException


----------------------------------------
4.3. Working with the Activiti services

すぐに動確したいのなら
Activiti unit test template の org.activiti.MyUnitTest に testUserguideCode を追加して動かせば良い

4.3.1. Deploying the process

src/test/resources/org/activiti/test に VacationRequest.bpmn20.xml を作成し
RepositoryService 使って静的情報をデプロイする
# bpmn20.xml のコードは、https://www.activiti.org/userguide/index.html 参照

|ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine;
RepositoryService repositoryService = processEngine.getRepositoryService;
|repositoryService.createDeployment
| .addClasspathResource("org/activiti/test/VacationRequest.bpmn20.xml")
| .deploy;

|Log.info("Number of process definitions: " + |repositoryService.createProcessDefinitionQuery.count);

4.3.2. Starting a process instance

プロセス定義をActivitiエンジンにデプロイしたら、新規にプロセスインスタンスを開始できる
プロセス定義はいわゆるブループリント

実行状態にあるものは全て RuntimeService で参照可能
プロセスインスタンスは、プロセス定義にあるkeyを指定して開始できる

We’re also providing some process variables at process instance start, because the description of the first user task will use these in its expressions. Process variables are commonly used because they give meaning to the process instances for a certain process definition. Typically, the process variables are what make process instances differ from one another.

|Map variables = new HashMap;
|variables.put("employeeName", "Kermit");
|variables.put("numberOfDays", new Integer(4));
|variables.put("vacationMotivation", "I'm really tired!");

|RuntimeService runtimeService = processEngine.getRuntimeService;
|ProcessInstance processInstance = |runtimeService.startProcessInstanceByKey("vacationRequest", variables);

|// Verify that we started a new process instance
|Log.info("Number of process instances: " + |runtimeService.createProcessInstanceQuery.count);

4.3.3. Completing tasks

プロセスインスタンスが開始されたら、最初のユーザタスクに進む

タスク情報を取得して
|// Fetch all tasks for the management group
|TaskService taskService = processEngine.getTaskService;
|List tasks = |taskService.createTaskQuery.taskCandidateGroup("management").list;
|for (Task task : tasks) {
| Log.info("Task available: " + task.getName);
|}

タスクを完了させる
|ask task = tasks.get(0);

|Map taskVariables = new HashMap;
|taskVariables.put("vacationApproved", "false");
|taskVariables.put("managerMotivation", "We have a tight deadline!");
|taskService.complete(task.getId, taskVariables);

4.3.4. Suspending and activating a process

RepositoryService でプロセス定義をサスペンドできる。
サスペンドされている間は新しいプロセスインスタンスの生成はできない

|repositoryService.suspendProcessDefinitionByKey("vacationRequest");
|try {
| runtimeService.startProcessInstanceByKey("vacationRequest");
|} catch (ActivitiException e) {
| e.printStackTrace;
|}

4.3.5. Further reading

Javadoc をご参照あれ

----------------------------------------
4.4. Query API

エンジンからデータを取得して照会する方法は2つ
Query API を使用するか、native queries を使用する

Query API は、型セーフ。任意の条件を渡して使用する
自由自在にSQLを組みたければnative queriesを使用するまで

----------------------------------------
4.5. Variables

プロセスインスタンスが各ステップを実行するのに使用するもので、
Activiti においては variables と呼ばれ、データベースに保存される
# Variables can be used in expressions (for example to select the correct outgoing sequence flow in an exclusive gateway), in java service tasks when calling external services (for example to provide the input or store the result of the service call), etc.

プロセスインスタンスのみならず、
実行(executions)、ユーザタスクも variables を持てる
各 variable は、ACT_RU_VARIABLE テーブルに一行で格納される
# executions are specific pointers to where the process is active.

|ProcessInstance startProcessInstanceByKey(String processDefinitionKey, Map variables);

プロセス実行中で variables を追加できる
|void setVariable(String executionId, String variableName, Object value);
|void setVariables(String executionId, Map variables);

ローカルに設定することも可能。
これらは、その実行(execution)でしか参照できない。プロセスインスタンスまで伝搬させたくない情報に有用
# プロセスインスタンスは、実行(executions)をツリー構造で保持する
|void setVariableLocal(String executionId, String variableName, Object value);
|void setVariablesLocal(String executionId, Map variables);

valiables はfetchも可能
# TaskServiceに類似メソッドあることに留意あれ
つまり、実行(executions)などのタスクが、そのタスクでのみ有効なローカルvariablesを持てるということ
現在の実行(execution)ないしタスクのオブジェクトに対してvariablesを設定/リトリーブする

|execution.getVariables;
|execution.getVariables(Collection variableNames);
|execution.getVariable(String variableName);

|execution.setVariables(Map variables);
|execution.setVariable(String variableName, Object value);

Activiti v5.17以降であれば、varibalesの設定/照会のDBアクセスをより制御するすることも可能
|Map getVariables(Collection variableNames, boolean |fetchAllVariables);
|Object getVariable(String variableName, boolean fetchAllVariables);
|void setVariable(String variableName, Object value, boolean fetchAllVariables);

----------------------------------------
4.6. Transient variables

variable の一種でで、さも定番variableのようなもの
ただし、永続化されている訳ではない
特殊ユースケースで有用になる >> ご本家参照

----------------------------------------
4.7. Expressions

Activiti の形式変換は UELを使用している。
# UEL = Unified Expression Language, EE6に組み込まれた仕様

----------------------------------------
4.8. Unit testing

----------------------------------------
4.9. Debugging unit tests

----------------------------------------
4.10. The process engine in a web application

ProcessEngineはスレッドセーフ
マルチスレッドのWebアプリでの使用も可能

----------------------------------------

■ RepositoryService
 -createDeployment
 -deleteDeployment
 -setDeploymentCategory
 -setDeploymentKey
 -getDeploymentResourceNames
 -getResourceAsStream
 -changeDeploymentTenantId
 -createProcessDefinitionQuery
 -createNativeProcessDefinitionQuery
 -createDeploymentQuery
 -createNativeDeploymentQuery
 -suspendProcessDefinitionById
 -suspendProcessDefinitionByKey
 -activateProcessDefinitionById
 -activateProcessDefinitionByKey
 -setProcessDefinitionCategory
 -getProcessModel
 -getProcessDiagram
 -getProcessDefinition
 -isActiviti5ProcessDefinition
 -isProcessDefinitionSuspended
 -getBpmnModel
 -getProcessDiagramLayout
 -newModel
 -saveModel
 -deleteModel
 -addModelEditorSource
 -addModelEditorSourceExtra
 -createModelQuery
 -createNativeModelQuery
 -getModel
 -getModelEditorSource
 -getModelEditorSourceExtra
 -addCandidateStarterUser
 -addCandidateStarterGroup
 -deleteCandidateStarterUser
 -deleteCandidateStarterGroup
 -getIdentityLinksForProcessDefinition
 -validateProcess

■ RuntimeService
ProcessInstance
 -createProcessInstanceBuilder
 -startProcessInstanceByKey
 -startProcessInstanceByKeyAndTenantId
 -startProcessInstanceById
 -startProcessInstanceByMessage
 -startProcessInstanceByMessageAndTenantId
 -deleteProcessInstance
XXX
 -getActiveActivityIds
 -trigger
 -updateBusinessKey
User/Group
 -addUserIdentityLink
 -addGroupIdentityLink
 -addParticipantUser
 -addParticipantGroup
 -deleteParticipantUser
 -deleteParticipantGroup
 -deleteUserIdentityLink
 -deleteGroupIdentityLink
 -getIdentityLinksForProcessInstance
Variables
 -getVariables
 -getVariableInstances
 -getVariableInstancesByExecutionIds
 -getVariablesLocal
 -getVariableInstancesLocal
 -getVariable
 -getVariableInstance
 -hasVariable
 -getVariableLocal
 -getVariableInstanceLocal
 -hasVariableLocal
 -setVariable
 -setVariableLocal
 -setVariables
 -setVariablesLocal
 -removeVariable
 -removeVariableLocal
 -removeVariables
 -removeVariablesLocal
その他
 -getDataObjects
 -getDataObjectsLocal
 -getDataObject
 -getDataObjectLocal
 -createExecutionQuery
 -createNativeExecutionQuery
 -createProcessInstanceQuery
 -createNativeProcessInstanceQuery
 -suspendProcessInstanceById
 -activateProcessInstanceById
Event
 -signalEventReceived
 -signalEventReceivedWithTenantId
 -signalEventReceivedAsync
 -signalEventReceivedAsyncWithTenantId
 -messageEventReceived
 -messageEventReceivedAsync
 -addEventListener
 -removeEventListener
 -dispatchEvent
 -setProcessInstanceName
 -getEnabledActivitiesFromAdhocSubProcess
 -executeActivityInAdhocSubProcess
 -completeAdhocSubProcess
 -getProcessInstanceEvents

■ TaskService
基本操作
 -newTask
 -saveTask
 -deleteTask(s)
 -claim
 -unclaim
 -complete
 -delegateTask
 -resolveTask
 -setPriority
 -setDueDate
User/Group
 -setAssignee
 -setOwner
 -getIdentityLinksForTask
 -addCandidateUser
 -addCandidateGroup
 -addUserIdentityLink
 -addGroupIdentityLink
 -deleteCandidateUser
 -deleteCandidateGroup
 -deleteUserIdentityLink
 -deleteGroupIdentityLink
Query
 -createTaskQuery
 -createNativeTaskQuery
Variable
 -set/get/has/removeVariable(s)
 -set/get/has/removeVariable(s)Local
 -getVariableInstance(s)
 -getVariableInstanceLocal
 -getVariableInstancesLocalByTaskIds
 -getVariableInstancesLocal
その他
 -getDataObject(s)
 -addComment
 -getComment
 -deleteComment(s)
 -getTaskComments
 -getCommentsByType
 -getTaskEvents
 -getEvent
 -getProcessInstanceComments
 -createAttachment
 -saveAttachment
 -getAttachment
 -getAttachmentContent
 -getTaskAttachments
 -getProcessInstanceAttachments
 -deleteAttachment
 -getSubTasks

■ IdentityService
User
 -newUser(String)
 -saveUser(User)
 -createUserQuery()
 -createNativeUserQuery()
 -deleteUser(String)
 -checkPassword(String, String)
 -setAuthenticatedUserId(String)
 -setUserPicture(String, Picture)
 -getUserPicture(String)
 -setUserInfo(String, String, String)
 -getUserInfo(String, String)
 -getUserInfoKeys(String)
 -deleteUserInfo(String, String)
Group
 -newGroup(String)
 -createGroupQuery()
 -createNativeGroupQuery()
 -saveGroup(Group)
 -deleteGroup(String)
Membership
 -createMembership(String, String)
 -deleteMembership(String, String)

■ FormService
基本操作
 -saveFormData(String, Map)
StartForm
 -submitStartFormData
 -getStartFormKey
 -getStartFormData
 -getRenderedStartForm
TaskForm
 -submitTaskFormData
 -getTaskFormKey
 -getTaskFormData
 -getRenderedTaskForm

■ HistoryService
ProcessInstance
 -createHistoricProcessInstanceQuery
 -createNativeHistoricProcessInstanceQuery
 -deleteHistoricProcessInstance(String)
 -getHistoricIdentityLinksForProcessInstance(String)
 -createProcessInstanceHistoryLogQuery(String)
ActivityInstance
 -createHistoricActivityInstanceQuery
 -createNativeHistoricActivityInstanceQuery
TaskInstance
 -createHistoricTaskInstanceQuery
 -createNativeHistoricTaskInstanceQuery
 -deleteHistoricTaskInstance(String)
 -getHistoricIdentityLinksForTask(String)
Detail
 -createHistoricDetailQuery
 -createNativeHistoricDetailQuery
VariableInstance
 -createHistoricVariableInstanceQuery
 -createNativeHistoricVariableInstanceQuery

■ ManagementService
 -getTableCount/Name/MetaData
 -createTablePageQuery
 -createJobQuery
 -createTimerJobQuery
 -createSuspendedJobQuery
 -createDeadLetterJobQuery
 -executeJob
 -moveXxxJob
 -deleteJob
 -deleteTimerJob
 -setJobRetries, etc.

■ DynamicBpmnService
get/saveProcessDefinitionInfo
changeServiceTaskClassName
changeServiceTaskExpression
changeUserTaskName
changeUserTaskDueDate
changeUserTaskPriority
etc.


tag : Activiti BPMN BPM ProcessEngine RepositoryService RuntimeService

2017-11-18 16:59 : 開発 : コメント : 0 : トラックバック : 0 :
ホーム  次のページ »

search

ad



counter


tag cloud

category cloud