我有以下基因名称字典:
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.
有没有有效的方法呢?实际上,我们会处理数以百万计的句子。
答案 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
比句子长得多。