在Python中基于字典/列表标记单词

在Python中基于字典/列表标记单词,python,regex,string,Python,Regex,String,我有以下基因名称词典: gene_dict = {"repA1":1, "leuB":1} # the actual dictionary is longer, around ~30K entries. # or in list format # gene_list = ["repA1", "leuB"] 我想做的是给任何一个句子,我们搜索上面字典中包含的词汇,然后给它们加上标签 例如,给出这句话: mytext = "xxxxx repA1 yyyy REPA1 zzz." 然后将

我有以下基因名称词典:

gene_dict = {"repA1":1, "leuB":1} 
# the actual dictionary is longer, around ~30K entries. 
# or in list format 
# gene_list = ["repA1", "leuB"] 
我想做的是给任何一个句子,我们搜索上面字典中包含的词汇,然后给它们加上标签

例如,给出这句话:

mytext = "xxxxx repA1 yyyy REPA1 zzz."
然后将其标记为:

xxxxx <GENE>repA1</GENE> yyyy <GENE>REPA1</GENE> zzz.
xxxxx repA1 yyy repazzz。
有什么有效的方法可以做到这一点吗?实际上,我们会处理数百万个句子。

如果你的“基因列表”不是很长,你可以使用一个编译过的正则表达式,比如

import re

gene_list = ["repA1", "leuB"]
regexp = re.compile('|'.join(gene_list), flags=re.IGNORECASE)
result = re.sub(regexp, r'<GENE>\g<0></GENE>', 'xxxxx repA1 yyyy REPA1 zzz.')
重新导入
基因列表=[“repA1”,“leuB”]
regexp=re.compile('|'.join(基因列表),flags=re.IGNORECASE)
result=re.sub(regexp,r'\g',xxxxx repA1 yyy repA1 zzz')
把你所有的句子都循环起来。我认为这应该非常快。

如果你的“基因列表”不是很长,你可以使用一个编译过的正则表达式,比如

import re

gene_list = ["repA1", "leuB"]
regexp = re.compile('|'.join(gene_list), flags=re.IGNORECASE)
result = re.sub(regexp, r'<GENE>\g<0></GENE>', 'xxxxx repA1 yyyy REPA1 zzz.')
重新导入
基因列表=[“repA1”,“leuB”]
regexp=re.compile('|'.join(基因列表),flags=re.IGNORECASE)
result=re.sub(regexp,r'\g',xxxxx repA1 yyy repA1 zzz')
把你所有的句子都循环起来。我认为这应该很快。

如果大多数句子都很短,并且用空格隔开,比如:

gene_dict = {"repA1":1, "leuB":1}
format_gene = "<GENE>{}</GENE>".format

mytext = " ".join(format_gene(word) if word in gene_dict else word for word in mytext.split())
这些假设中的每一个都假设
拆分
的句子不会花费太多的时间,这是公平的,假设
基因dict
比句子长得多。

如果大多数句子都很短并且用单个空格隔开,比如:

gene_dict = {"repA1":1, "leuB":1}
format_gene = "<GENE>{}</GENE>".format

mytext = " ".join(format_gene(word) if word in gene_dict else word for word in mytext.split())

其中每一个都假设
split
s的句子不会花费太多的时间,这是公平的假设
genes\u dict
比句子长得多。

看起来任务很容易并行。看看您可以使用
Pool
本地并行化任务,或者使用mincemeatpy之类的工具来利用map reduce服务器。看起来该任务很容易并行化。看看您可以使用
Pool
将任务本地或类似MinceMeaty之类的东西并行化,以利用MapReduce服务器。\\n实际字典的长度更长,大约为约30K条目的条目。如果有30K项,则最好不要迭代字典中的条目列表:。性能取决于数据(句子中基因的密度/稀疏程度等),因此分析应该会给你一些有用的提示。似乎条目的数量要比句子的大小高得多。使用Set()检查基因成员身份确实更好。虽然把句子分解成单词也会增加负担。正如@jpe所说,我建议您进行一些代码分析并运行一些测试。#实际字典较长,大约有30K个条目。如果有30K个条目,那么您最好遍历字典中的条目列表:。性能取决于数据(句子中基因的密度/稀疏程度等),因此分析应该会给你一些有用的提示。似乎条目的数量要比句子的大小高得多。使用Set()检查基因成员身份确实更好。虽然把句子分解成单词也会增加负担。正如@jpe所说,我建议你做一些代码分析并运行一些测试。
genes=set(genes)
你的意思是
genes=set(gene_dict)
你的代码只标记了第一个单词
xxxxx repA1 yyyy repA1 zzz。
我如何使它更一般化,使它成为一个实例?这让事情变得复杂了……)。在我修复它之前,哪一个更快(我应该改进哪一个)?
genes=set(genes)
你的意思是
genes=set(gene\u dict)
你的代码只标记了第一个单词
xxxxx repA1 yyyy repA1 zzz。
我怎样才能使它更一般化,使它成为一个实例呢?这让事情变得复杂了……)。在我修复它之前,哪一个更快(那么我应该改进哪一个)?