2021年10月1日金曜日

Tails of Words v0.3.0 リリース

シルバーウィークに久しぶりに連休を取ったので Tales of ARISE をやってました。まだクリアしてません。もうちょいでクリアだと思うのですが。なので最近はゲームばっかりしてます。

はい。では本題です。

tails-of-words 0.3.0 をリリースしました。
tails-of-words は「ブログズミ: CEDEC でやってた表記ゆれ検出をお試し実装してみた」で作成した表記ゆれ検出ツールです。
(なんだか某ゲームっぽいツール名ですね)

今回は前回ブログ時点からの差分を紹介したいと思います。

変更履歴
knp 対応

まず大きな変更点として knp(pyknp) に対応しました。
knp は juman の出力を入力に係り受けとかを解析してくれるものですが、
tails-of-words では knp の固有表現検出機能を使いました。

固有表現検出機能を使うと以下のように「奈良先端科学技術大学院大学」を1つの単語として検出できるようになります。


knp を有効にするには --knp オプションを付けます。実行環境に knp がインストールされている必要があるので、knp インストール済みの tails-of-words の docker container を使うのが楽だと思います。

コンフィグファイル対応

tails-of-words のオプション及び評価関数のパラメータをファイル指定できるようにしました。

log: DEBUG
html2test: True
exclude_ascii: True
exclude_alphabet: True
jaro_winkler: True
knp: False

# スコア計算の設定値
score_config:
  # 読みが同じ時にかける値
  same_yomi_scale: 1.2
  # 出現数の差の正規化数([0,1])にかける値
  occurrences_sacle: 1.0
  # 読みが同じかつ、長音が消えてる場合にかける値
  same_yomi_with_remove_long_vowel_scale: 0.8
  # 片方を内包し、末尾の長音の差分のみの場合にかける値
  diff_only_long_vowel_scale: 1.2
  # 片方を内包している場合にかける値
  inclue_other_one: 0.5
  
形態素解析のための正規化による表記ゆれ吸収問題を解決

pyknp で knp/jumanpp の出力する際に特定の文字列が出力フォーマットと衝突し、正しくパースできないので(たとえば半角スペースや @ などの記号)、解析前に全角文字に変換したりしているのですが、これにより当該文字の半角・全角の表記ゆれ検出ができないようになっていました。

これに対応するために、pyknp の結果の形態素の見出し(midasi)から正規化した文字をもとに戻す処理をいれました。
また固有表現検出に対応したことで「2021 年秋」と「2021 年秋」のようなスペースのゆれも検出できるようになりました。(スペース含んだ固有表現と認識されればの話)

jaro_winkler 編集距離に対応
レーベンシュタイン距離がデフォルトですが、ジャロ・ウィンクラー距離にも対応しました。
--jw,--jaro-winkler オプションを付けると切り替わります。
tails-of-words では編集距離を 0-1 の値に正規化して評価していますが、この値が変わるので表記ゆれの検出結果にも変化がでます。
0=不一致 1=一致


XML入力に対応
Blogger のバックアップ出力が xml だったので、このブログを解析するために対応しました。
xml ファイルの場合は text が解析対象になります。

標準入力に対応
パイプでつなげて処理したい。curl で html 取ってきて解析させたい。ということで対応。
以下のように --stdin-type で html を指定すれば html2text した文字列で解析できます。
curl -fsSL https://srz-zumix.blogspot.com/2021/09/cedec.html | tails-of-words --stdin-type html swing --exclude-alphabet --exclude-ascii -t 1 -
ASCII のみやアルファベットのみを除外するオプションを追加
記号のみやアルファベットのみの形態素は未定義語の hinsi_id になるようなので、
tails-of-words swing -i 6 hoge.txt のように -i オプションで解析対象の品詞を名詞(6)のみにすることで除外できます。(デフォルトは 名詞(6) と 未定義語(15))

GET と Get や get など大文字小文字の揺れを除外したい場合、これで実現可能だったのですが、未定義語にはカタカナ語なども入ることがあるため、このユースケースに対応するために --exclude-alphabet (--no-alpha) と --exclude-ascii (--no-ascii) オプションを追加しました。
最後に
とりあえず実装してみた前回バージョンからだいぶパワーアップしました。
実際に拙著やこのブログの表記ゆれを検出しようと使ってみたら、こうなりました。
編集距離にはまだ他の手法もあるようなので、そのうち対応してみたいです。

今回は以上。



0 件のコメント:

コメントを投稿