Python 需要更快的代码来用字典中的值替换字符串
这就是我如何应用字典进行词干分析的方法。我的字典(d)已导入,现在是这种格式的Python 需要更快的代码来用字典中的值替换字符串,python,python-3.x,pandas,nltk,sklearn-pandas,Python,Python 3.x,Pandas,Nltk,Sklearn Pandas,这就是我如何应用字典进行词干分析的方法。我的字典(d)已导入,现在是这种格式的d={'nada.*':'nadas','mila.*':'milas'} 我写这段代码是为了阻止标记,但它运行得太慢,所以在完成之前我就停止了它。我想这是个问题,因为dict很大,而且有大量的令牌。 那么,如何实现我的stem字典,使代码能够正常运行呢? 我试图在nltk包中找到一个应用自定义dict的方法,但没有找到 #import stem dict d = {} with open("Stem rečnik.t
d={'nada.*':'nadas','mila.*':'milas'}
我写这段代码是为了阻止标记,但它运行得太慢,所以在完成之前我就停止了它。我想这是个问题,因为dict很大,而且有大量的令牌。
那么,如何实现我的stem字典,使代码能够正常运行呢?
我试图在nltk包中找到一个应用自定义dict的方法,但没有找到
#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_文本示例:
post_text = [
'Banca intesa #nocnamora',
'Banca intesa',
'banka haosa i neorganizovanosti!',
'Cucanje u banci umesto setnje posle rucka.',
"Lovin' it #intesa'"
]
请注意,虽然stem dict中的键是正则表达式,但它们都以一些特定字符的短字符串开头。假设特定字符的最小长度为3。然后,像这样构造一个dict:
'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个词干,只需要检查少数以正确前缀开头的词干。请注意,虽然词干dict中的键是正则表达式,但它们都以一些特定字符的短字符串开头。假设特定字符的最小长度为3。然后,像这样构造一个dict:
'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个阀杆,只需检查以正确前缀开头的少数阀杆。请提供
d
,以使其成为一个标准。为什么要使用re.match
而不仅仅是字符串匹配?或者更好:检查tokenin d
-是否在O(1)时间而不是O(n)时间内搜索。您提供了定义d
的代码。但它读取了一个我们看不到的文件。您需要放弃文件引用并提供字典的直接定义,或者提供该文件的内容。此外,还应提供传递给函数自定义标记器的文本示例。考虑一个这样的方法,我需要能够复制并粘贴您提供的代码到我的系统中,它需要运行。如果你有任何我看不到的信息引用,它就不会运行。所有的正则表达式模式都是这样的吗,即词干后跟零个或多个字符?(stem.*
)@hope94d
是一个dict,而不是一个对的列表。我能看到的唯一明显的优化是预处理您的所有正则表达式:d[re.compile(key)]=val.replace(“\n”,”)
请提供d
,使其成为一个新的正则表达式。为什么要使用re.match
而不仅仅是字符串匹配?或者更好:检查tokenin d
-是否在O(1)时间而不是O(n)时间内搜索。您提供了定义d
的代码。但它读取了一个我们看不到的文件。您需要放弃文件引用并提供字典的直接定义,或者提供该文件的内容。此外,还应提供传递给函数自定义标记器的文本示例。考虑一个这样的方法,我需要能够复制并粘贴您提供的代码到我的系统中,它需要运行。如果你有任何我看不到的信息引用,它就不会运行。所有的正则表达式模式都是这样的吗,即词干后跟零个或多个字符?(stem.*
)@hope94d
是一个dict,而不是一个对的列表。我能看到的唯一明显的优化是预处理所有正则表达式:d[re.compile(key)]=val.replace(“\n”,”)