ITの隊長のブログ

ITの隊長のブログです。Pythonを使って仕事しています。最近は機械学習をさわりはじめたお(^ω^ = ^ω^)

Cabochaの構造がよくわからなかった件

f:id:aipacommander:20210616031914p:plain

よくみるフォーマットですね。コマンドで実行するとどの単語のまとまり(chunk)に係っているか確認できます。

で、こいつをPythonから使ってみるといまいちクラスのインターフェースがよくわからず四苦八苦していましたが、先に組んでくれた人のコードをみたらだいたい理解できた。

github.com

簡略版でこんな感じ。

import CaboCha
from collections import defaultdict

option = '-d /usr/lib/mecab/dic/mecab-ipadic-neologd'
parser = CaboCha.Parser(option)
tree = cabocha.parse('昔、わたしが飼っていた猫は、とても美味しそうな缶詰を食べていた。')
prev_links_dic = defaultdict(list)
for chunk_id in range(tree.chunk_size()):
    chunk = tree.chunk(chunk_id)
    print('chunk_id:', chunk_id, ', chunk_link:', chunk.link)
    for j in range(chunk.token_size):
        token_id = chunk.token_pos + j
        token = tree.token(token_id)
        print(token.surface, '\t', token.feature)
    
    if chunk.link >= 0:
        prev_links_dic[chunk.link].append(chunk_id) 

# chunk_id: 0 , chunk_link: 2
# 昔   名詞,副詞可能,*,*,*,*,昔,ムカシ,ムカシ
# 、   記号,読点,*,*,*,*,、,、,、
# chunk_id: 1 , chunk_link: 2
# わたし     名詞,代名詞,一般,*,*,*,わたし,ワタシ,ワタシ
# が   助詞,格助詞,一般,*,*,*,が,ガ,ガ
# chunk_id: 2 , chunk_link: 3
# 飼っ    動詞,自立,*,*,五段・ワ行促音便,連用タ接続,飼う,カッ,カッ
# て   助詞,接続助詞,*,*,*,*,て,テ,テ
# い   動詞,非自立,*,*,一段,連用形,いる,イ,イ
# た   助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
# chunk_id: 3 , chunk_link: 7
# 猫   名詞,一般,*,*,*,*,猫,ネコ,ネコ
# は   助詞,係助詞,*,*,*,*,は,ハ,ワ
# 、   記号,読点,*,*,*,*,、,、,、
# chunk_id: 4 , chunk_link: 5
# とても     副詞,助詞類接続,*,*,*,*,とても,トテモ,トテモ
# chunk_id: 5 , chunk_link: 6
# 美味し     形容詞,自立,*,*,形容詞・イ段,ガル接続,美味しい,オイシ,オイシ
# そう    名詞,接尾,助動詞語幹,*,*,*,そう,ソウ,ソー
# な   助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
# chunk_id: 6 , chunk_link: 7
# 缶詰    名詞,一般,*,*,*,*,缶詰,カンヅメ,カンズメ
# を   助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
# chunk_id: 7 , chunk_link: -1
# 食べ    動詞,自立,*,*,一段,連用形,食べる,タベ,タベ
# て   助詞,接続助詞,*,*,*,*,て,テ,テ
# い   動詞,非自立,*,*,一段,連用形,いる,イ,イ
# た   助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
# 。   記号,句点,*,*,*,*,。,。,。

for chunk_id in prev_links_dic.keys():
    print(chunk_id, prev_links_dic[chunk_id])
# 2 [0, 1]
# 3 [2]
# 7 [3, 6]
# 5 [4]
# 6 [5]

パワポで覚えたショートカットとかノウハウがたまっていく記事

Macパワポです

  • ⌘ + ⌥ + g グループ化
  • ⌘ + ⌥ + shift + g グループ化解除
  • 単一、複数オブジェクトをactiveにしておく → shift + ctrl コピーしたオブジェクトと水平(?)にコピペができる

「クチコミ分析システムの作り方 実践・自然言語処理シリーズ」を読んでる

memo

Seleniumを使って、dl > dt, ddのフォーマットでddが複数あるときのスクレイピング

こういうやつ

<dl>
    <dt></dt>
    <dd></dd>
    <dd></dd>
    <dt></dt>
    <dd></dd>
</dl>

dtとddで1対1かしらとか思ってたけど、そうじゃなかったねめんどくさい。

というわけでゴリ押してみた

def add_values(values, _values):
    if len(_values) > 0:
        values.append(_values)


def get_data(driver):
    ds = driver.find_elements_by_css_selector('dl > *')
    keys = []
    values = []
    _values = []
    n = len(ds)
    i = 0
    while n > i:
        d = ds[i]
        if d.tag_name == 'dt':
            keys.append(d.text)
            add_values(values, _values)
            _values = []
            i += 1
            continue

        if d.tag_name == 'dd':
            _values.append(d.text)
            i += 1
            continue

    add_values(values, _values) 
    return dict(zip(keys, values))

途中でddがきたら、dtが来るまでため続けて、dtがきたらddをvaluesのlistに追加してクリアするを繰り返す。

jqueryみたいにnextとか使えたら。。。って思うけどまぁいいや(多分これで大丈夫なはず)。さっと作ったので多分ボロいはず

SageMakerで遊ぶメモ#2

trainしてs3にアップされたモデルをデプロイするコード

from boto3.session import Session


class SagemakerClient:

    def __init__(self):
        self.client = Session().client("sagemaker", region_name="us-west-2")

    def create_model(self, model_data_url):

        model_params = {
            "ExecutionRoleArn": "hogehoge-fugafuga:role/aipa-sagemaker-train", 
            "ModelName": "sample-model", # モデル名
            "PrimaryContainer": {
                "Image": "hogehoge-fugafuga.com/aipa-sagemaker-test", # ECRにプッシュしたイメージURL
                "ModelDataUrl": model_data_url # モデルデータが格納されているS3のパス
            }
        }

        self.client.create_model(**model_params)


if __name__ == '__main__':
    model_data_url = 's3://aipa-hogehoge-fugafuga-train/output-data/sample-training2/output/model.tar.gz'
    SagemakerClient().create_model(model_data_url)

ここから推論ってどうするんや・・・・?って気になったので調べてたら下記が参考になった(考え方ね)

qiita.com

そもそも、チュートリアルにあるnginx.confとかwsgi.pyってなんで???なしてFlask使っているの???って思ってたけど、エンドポイントでの通信はHTTPで行われるので、登録するDocker imageではFlaskやnginx等の設定が必要とのこと。webのミドルウェアwsgiを使えない人には厳しそう。。。コピペするだけで良いとは思うけど

dev.classmethod.jp