需要更快的代码来用字典中的值替换字符串

时间:2017-08-18 23:19:46

标签: python python-3.x pandas nltk sklearn-pandas

这就是我如何应用词典进行词干分析。我的字典(d)已导入,现在它采用此格式d={'nada.*':'nadas', 'mila.*':'milas'} 我写这个代码来阻止令牌,但是它运行得太慢,所以我在它完成之前就停止了它。我想这是问题,因为dict很大,并且有大量的令牌。 那么,我如何实现我的词干字典,以便代码可以正常运行? 我试图在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示例:

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

1 个答案:

答案 0 :(得分:0)

请注意,虽然词干中的键是正则表达式,但它们都以一些特定字符的短字符串开头。假设特定字符的最小长度为3.然后,构造一个这样的字典:

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

当然,您应该在开始时re.compile()所有这些模式。

然后你可以在这个词典中进行更便宜的三字符查找:

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个词干。