データナード

機械学習と自然言語処理についての備忘録 (旧ナード戦隊データマン)

bicleanerの特徴量設計コードを抜き出す

bicleanerの特徴量設計のコードを抜き出すことが出来れば、他のツール(例えばzipporahやlaser)の特徴量を組み合わせて使えるようになります。

features.py

基本的に、特徴量設計は以下の部分にまとめて書かれています。

https://github.com/bitextor/bicleaner/blob/master/bicleaner/features.py

トーカナイズ部分の修正

ただ、このコードはMosesに過度に依存しているため、これをMeCabにも対応できるようにします。

以下の部分を修正します:

def feature_extract(srcsen, trgsen, tokenize_l, tokenize_r, args):
    [略]
 
    #    parts = row.strip().split("\t")
 
    #    if len(parts) == 1:
    #        parts.append("")
 
    # Sentence tokenization, with and without capital letters
    toks_l = tokenize_l(srcsen.rstrip('\n'))
    toks_r = tokenize_r(trgsen.rstrip('\n'))
    left_sentence_orig_tok = [
        no_escaping(t) for t in toks_l
    ][0:250]
    right_sentence_orig_tok = [
        no_escaping(t) for t in toks_r
    ][0:250]

    [略]

デフォルトパラメータの追加

次に、コードの先頭にデフォルトパラメータについてのクラスを作成し、インスタンス化します。

try:
    from .util import no_escaping, regex_alpha
    from .prob_dict import ProbabilisticDictionary
except (SystemError, ImportError):
    from util import no_escaping, regex_alpha
    from prob_dict import ProbabilisticDictionary
from collections import Counter
 
 
class Args:
    def __init__(self,
                 source_lang="ja",
                 target_lang="en",
                 length_ratio=1.0,
                 qmax_limit=20,
                 normalize_by_length=True,
                 treat_oovs=True,
                 disable_features_quest=True,
                 dict_sl_tl="/root/work/aspec_experiments2/bicleaner/dic/jesc/dict-ja-fixed.gz",
                 dict_tl_sl="/root/work/aspec_experiments2/bicleaner/dic/jesc/dict-en-fixed.gz",
                 features_version=2):
        self.source_lang = source_lang
        self.target_lang = target_lang
        self.qmax_limit = qmax_limit
        self.normalize_by_length = normalize_by_length
        self.treat_oovs = treat_oovs
        self.disable_features_quest = disable_features_quest
        self.dict_sl_tl = ProbabilisticDictionary(dict_sl_tl)
        self.dict_tl_sl = ProbabilisticDictionary(dict_tl_sl)
        self.features_version = features_version
        self.length_ratio = length_ratio
 
 
default_args = Args()

デフォルトパラメータは各自自分の環境に合わせて設定を行います。

実行

簡易的に実行するには以下のコードを実行します。

# coding: utf-8
import MeCab
from bicleaner_features import feature_extract
from bicleaner_features import default_args

tagger = MeCab.Tagger("-Owakati")

def tokenize(text):
    return tagger.parse(text).split()

if __name__ == "__main__":    
    st = "これはテストです"
    tt = "This is test."
    feature = feature_extract(st, tt, tokenize, tokenize, default_args)
    print(feature)

特徴量は、ソース文とターゲット文から求めることができます。加えてソース文トーカナイザとターゲット文トーカナイザを渡し、さらにデフォルトパラメータを渡します。

参考

  1. bicleaner/features.py at master · bitextor/bicleaner · GitHub