这就是我如何应用词典进行词干分析。我的字典(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'"
]
答案 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个词干。