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

时间:2014-05-26 08:36:16

标签: 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."

然后将其标记为:

xxxxx <GENE>repA1</GENE> yyyy <GENE>REPA1</GENE> zzz.

有没有有效的方法呢?实际上,我们会处理数以百万计的句子。

2 个答案:

答案 0 :(得分:3)

如果你&#34; gene_list&#34;在真的非常非常长的时候,你可以使用编译的正则表达式,比如

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.')

并为你的所有句子添加一个循环。我认为这应该很快。

答案 1 :(得分:1)

如果大多数的句子都很短并且被单个空格分隔,那就像:

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())

会更快。

对于稍微长一些的句子或句子,你无法使用" ".join进行改革,使用多个.replace可能更有效或更正确:

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

to_replace = genes.intersection(mytext.split())

for gene in to_replace:
    mytext = mytext.replace(gene, format_gene(gene))

其中每一个都假设split个句子不会占用敲诈时间,这是公平的假设genes_dict比句子长得多。

相关问题