2017-08-18 3 views
1

これは、ステミングに辞書を適用する方法です。 d={'nada.*':'nadas', 'mila.*':'milas'} 私はこのコードをstemmトークンに書きましたが、それはTOO SLOWを実行するので、終了する前に停止しました。私はそれが問題だと思います.Dictが大きく、トークンがたくさんあるからです。 したがって、コードをnormalyで実行できるように、私はどのように私のステム辞書を実装できますか? nltkパッケージでカスタムディクテーションを適用する方法を見つけようとしましたが、見つからなかった。文字列を辞書からの値で置き換えるコードが必要

#import stem dict 
d = {} 
with open("Stem rečnik.txt") as f: 
    for line in f: 
     key, val = line.split(":") 
     d[key.replace("\n","")] = val.replace("\n","") 

#define tokenizer 
def custom_tokenizer(text): 
    #split- space 
    tokens = nltk.tokenize.word_tokenize(text) 
    #stemmer 
    for i, token in enumerate(tokens): 
     for key, val in d.items(): 
      if re.match(key, token): 
       tokens[i] = val 
       break 
    return tokens 

辞書サンプル:

bank.{1}$:banka 
intes.{1}$:intesa 
intes.{1}$:intesa 
intez.{1}$:intesa 
intezin.*:intesa 
banke:banka 
banaka:banka 
bankama:banka 

post_textサンプル:あなたの幹のdictのキーは正規表現であるが、彼らはすべてのいくつかの特定の文字の短い文字列で始まること

post_text = [ 
    'Banca intesa #nocnamora', 
    'Banca intesa', 
    'banka haosa i neorganizovanosti!', 
    'Cucanje u banci umesto setnje posle rucka.', 
    "Lovin' it #intesa'" 
] 
+2

これを[mcve]にするには 'd'を指定してください。なぜ文字列マッチングの代わりに 're.match'を使うのですか?それとも、もっとうまくいっていますか? 'token in d'がO(n)ではなくO(1)時間内に検索するかどうかをチェックします。 –

+0

これは、キーが正規表現だからです。ああ、それは素晴らしいことです、私は今どのように動作するかをチェックします...あなたがdのトークンを検索する方法を教えてもらえますか?dは私が書いたようにペアのリストです。 –

+3

あなたのために 'd'を定義するコードを提供しました。しかし、それは我々が見ることができないファイルを読み取ります。ファイル参照を忘れて辞書の直接定義を提供するか、そのファイルの内容を提供する必要があります。また、 'custom_tokenizer'関数に渡す' text'のサンプルを提供する必要があります。この方法で[** MCVE **](http://stackoverflow.com/help/mcve)を考えると、あなたが提供したコードをコピーして私のシステムに貼り付けて実行する必要があります。あなたが見ることができない情報への参照があれば、それは実行されません。 – piRSquared

答えて

0

お知らせ。のは、このような辞書を構築し、特定の文字の最小の長さが続いて3であるとしましょう:もちろん

'ban' : [('bank.$', 'banka'), 
     ('banke', 'banka'), 
     ('banaka', 'banka'), 
     ('bankama', 'banka'), 
     ], 
'int' : [('inte[sz].$', 'intesa'), 
     ('intezin.*', 'intesa'), 
     ], 

を、あなたべき冒頭にre.compile()すべてのこれらのパターン。

次にあなたがこの辞書に安く、3文字の検索を行うことができます

def custom_tokenizer(text): 
    tokens = nltk.tokenize.word_tokenize(text) 
    for i, token in enumerate(tokens): 
     for key, val in d.get(token[:3], []): 
      if re.match(key, token): 
       tokens[i] = val 
       break 
    return tokens 

を今すぐ代わりに、すべての500の茎チェックの、あなただけの右の接頭辞で始まるいくつかをチェックする必要があります。

関連する問題