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

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)已导入,现在是这种格式的
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.*
)@hope94
d
是一个dict,而不是一个对的列表。我能看到的唯一明显的优化是预处理您的所有正则表达式:
d[re.compile(key)]=val.replace(“\n”,”)
请提供
d
,使其成为一个新的正则表达式。为什么要使用
re.match
而不仅仅是字符串匹配?或者更好:检查
tokenin d
-是否在O(1)时间而不是O(n)时间内搜索。您提供了定义
d
的代码。但它读取了一个我们看不到的文件。您需要放弃文件引用并提供字典的直接定义,或者提供该文件的内容。此外,还应提供传递给函数
自定义标记器
文本
示例。考虑一个这样的方法,我需要能够复制并粘贴您提供的代码到我的系统中,它需要运行。如果你有任何我看不到的信息引用,它就不会运行。所有的正则表达式模式都是这样的吗,即词干后跟零个或多个字符?(
stem.*
)@hope94
d
是一个dict,而不是一个对的列表。我能看到的唯一明显的优化是预处理所有正则表达式:
d[re.compile(key)]=val.replace(“\n”,”)