サポーターズ勉強会で文書分類についてハンズオンを行いました
7月31日に「文書分類で自然言語処理に触れる」というタイトルでの講師を行いました。
このような機会をいただき、どうもありがとうございました。
本記事では、題目の理由や講演の振り返りを行います。
続きを読む系列ラベリングの素性抽出
系列ラベリング問題を取り扱う際の素性抽出が、いつも複雑になりがちなので、テンプレートを書いてサクッと抽出できるよう整理しました。
どんな素性を抽出したいか
固有表現抽出を例にあげます。
以下の表は、「午前8時に東京駅で集合する。」という文を形態素解析し、IOB2(Inside-outside-beggining)タグ形式で固有表現のラベルを付与したものです。
単語 | 品詞 | IOB2タグ |
---|---|---|
午前 | 名詞 | B-TIME |
8 | 名詞 | I-TIME |
時 | 名詞 | I-TIME |
に | 助詞 | O |
東京 | 名詞 | B-LOCATION |
駅 | 名詞 | I-LOCATION |
で | 助詞 | O |
集合 | 名詞 | O |
する | 動詞 | O |
。 | 記号 | O |
「午前8時」はTIME属性、「東京駅」はLOCATION属性を持つことになります。
ここで、「東京」という単語を例に素性抽出します。
素性には、対象単語と前後2単語の表層形、対象単語と前後2単語の品詞、推定済みの前2単語のIOB2タグを利用するとします。 あるラベルを学習する際の素性は、Pythonの辞書形式で表すと以下のようになります。
{ "word-2": "時", "word-1": "に", "word": "東京", "word+1": "駅", "word+2": "で", "pos-2": "名詞", "pos-1": "助詞", "pos": "名詞", "pos+1": "名詞", "pos+2": "助詞", "iob-2": "I-TIME", "iob-1": "O" }
これを簡単に抽出できるように、テンプレート作ります。
テンプレートを使って素性抽出
テンプレートは、「ラベル名、素性抽出のための関数、対象単語からの相対的な位置」を持ちます。
素性抽出のための関数は、対象の素性を抽出するための関数で、例えば小文字かどうかを素性に含めたい場合は lambda x: x.surface.islower()
のような処理を記述します。
例では、あるトークンのインスタンス変数としてsurface
を持っているため、x.surface
でアクセスしていますが、x['surface']
のように与えるトークンの形式により異なります。
# 素性抽出のための関数 word_feature = lambda x: x.surface pos_feature = lambda x: x.pos iob2_feature = lambda x: x.iob2 # テンプレート templates = [ ("word-2", word_feature, -2), ("word-1", word_feature, -1), ("word", word_feature, 0), ("word+1", word_feature, 1), ("word+2", word_feature, 2), ("pos-2", pos_feature, -2), ("pos-1", pos_feature, -1),("pos", pos_feature, 0), ("pos+1", pos_feature, 1), ("pos+2", pos_feature, 2), ("iob2-2", iob2_feature, -2), ("iob2-1", iob2_feature, -1), ]
テンプレートを適用し素性抽出を行うメソッドを書きます。
def iter_feature(tokens, templates): tokens_len = len(tokens) for i in range(tokens_len): # バイアス項 feature = {"bias": 1.0} # テンプレートを適用 for label, f, target in templates: current = i + target if current < 0 or current >= tokens_len: continue feature[label] = f(tokens[current]) # BOSとEOS if i == 0: feature["BOS"] = True elif i == tokens_len - 1: feature["EOS"] = True yield feature
たとえば、scikit-learnを利用する場合は、辞書形式で抽出された素性を、DictVectorizer
でベクトル化することで、利用可能となります。
features = [] for tokens in corpus: features.extend(iter_feature(tokens, templates)) # from sklearn.feature_extraction import DictVectorizer feature_vectorizer = DictVectorizer() vec = feature_vectorizer.fit_transform(features)
同じテンプレートで推定を行う
実際の推定時には、以下のように先頭から順に推定し、推定したタグを代入していくことで、次のタグの素性抽出時に推定した前のタグが利用可能になります。
# tokensは推定したいトークン列, templatesは学習時と同じものを利用 for token, feature in zip(tokens, iter_feature(tokens, templates)): # 素性抽出 vec = feature_vectorizer.transform(feature) # tokenのiob2変数に推定値をセットする token.iob2 = label_encoder.inverse_transform(model.predict(vec))[0]
ErgoDoxEZを購入した
HHKB Pro 2 type-Sの日本語配列から、左右分離型キーボードであるErgoDoxEZに移行しました。
目的だった猫背の解消は、徐々に軽減されつつあるように思います。
きっかけから購入までを紹介します。
猫背解消がきっかけ
徹底的な猫背解消に取り組むためです。 現在猫背対策として、スタンディングデスクにしてディスプレイの高さに気を配ったり、ラットプルダウンやデッドリフトを始めとした筋トレに取り組んだりしています。
そんな中でHHKBの長所であるスリムなキーボードが、体格に合っていないことに気づきました。 キー入力をしていると、どうしても肩が前に出てしまいます。 左右分離型なら、肩を内転させずに作業できると考えました。
周りにErgoDoxEZユーザがいた
左右分離型キーボードユーザが周りにたまたま居たため、入力させてもらいました。 ErgoDoxEZとBaroccoを体験しました。
直感ですが、徹底的に対策するならErgoDoxEZがパームレストがあり、傾斜も変更可能なためいいと考えました。
購入してから届くまで三週間
ErgoDoxEZの公式サイトから注文しました。
無刻印の黒色で、ティルトキットとパームレストを付けました。 無刻印にした理由は、キー配置を変更した際に入れ換えなくていいことと、入れ換えたとしてもキートップの傾斜が適切なものではなくなるためです。
注文すると、宛先や注文内容が記載されたメールが届きます。 総計325USDでした。
1x Tilt/Tent Kit - Black for $25.00 each 1x The Wing: Custom ErgoDox EZ Wrist Rest - Black for $30.00 each 1x ErgoDox EZ Original Standalone - Blank / Black / Cherry MX Silent Red for $240.00 each Subtotal : $295.00 USD Shipping : $30.00 USD Total : $325.00 USD
メールに記載のあった通り、約三週間後に発送されました。 配送状況などは、メール内のリンクからステータスを確認できます。
発送後にDHLのページから時間指定ができるため、都合のいい時間を希望します。
そこから待つこと約二日、指定時刻に佐川急便さんが来ました。 手数料を払って受けとりました(関税なのか何の手数料かは詳細はわからなかったが、1000円程度だったと思います)。
開封してセットアップすればErgoDoxEZライフが始まる
厚み約4cmくらいのわりと大きな箱を開封し、PCに接続すればErgoDoxEZライフが始まります。
私はキー設定でなんだかんだ数時間溶かしました(Emacsキーバインドで小指が疲れるため、どうやって親指にマッピングさせるか考えていると時間が溶けた)
Xonshを使ってみた
【Xonsh Advent Calendar 2017の13日目の記事です。】
Xonshがいいという話を聞いて、これは使ってみないと!と思い使ってみました。
今良いんですよXonshが https://t.co/zSU1i0yxPo
— ばんくし (@vaaaaanquish) 2017年11月24日
その備忘録です。
続きを読むPythonのrequestsモジュールでの文字コード対策
【Webスクレイピング Advent Calendar 2017 4日目の記事です。】
Pythonのrequests
モジュールは、 「Requestsは、人が使いやすいように設計されていて、Pythonで書かれている Apache2 Licensed ベースのHTTPライブラリです。」 と公式サイト1文目に記述されているほど、扱いやすいHTTPライブラリです。
そんなrequests
モジュールですが、日本語HTMLを対象に取得する際に文字化けを起こすことがしばしばあります。
その対策や原因について備忘録としてまとめます。
続きを読む