我从事文本挖掘工作,我的工作重点是生物医学实体(基因、蛋白质、药物和疾病)。我想和大家分享一些问题。
现在,我的目标是在生物医学文本(来自 Medline)中查找生物医学实体,并通过术语词典,我可以通过其唯一标识符来识别找到的每个实体。
为了存储文本、字典和结果,我使用 MongoDB(一种非 SQL 数据库)。每个摘要都被分成句子,每个句子都存储在一个新记录中(带有标记、 block 和词性标签的列表)。为了查找实体,我获取了所有句子,并为每个句子创建了字典中每个术语的正则表达式(在 Python 中):
for term in dicitonary:
matches = re.finditer(r'(' + term + ')', sentence)
for m in matches:
ini = m.start()
end = m.end()
result.append(ini, end, dictionary.get_identification[term])
但是它真的很慢,我有 150,000 个摘要的几个子集(>1,000,000 个句子)。
对我来说,提取更多实体(其术语不完全在我的字典中)的软匹配确实很有趣,但它可以增加我的运行时间。
我认为我的问题是为每个句子做很多正则表达式(我有包含 300,000 个条目的字典),因为我必须找到句子中的术语。如果没有机器学习算法,你怎么能解决这个问题呢?那么机器学习算法呢?现在,我可以灵活地改变我的编程语言、数据库......
非常感谢!!!
问候,
亚历克斯。
最佳答案
不要为每个术语
构建一个 RE,而是构建一个可以捕获所有术语的单一、分离的 RE:
pattern = re.compile("(%s)" % "|".join(re.escape(term) for term in dictionary))
然后使用pattern.finditer
。
至于“如何使用机器学习”,恕我直言,这是一个太宽泛的问题。首先在谷歌上搜索“生物医学命名实体识别”——有大量关于该问题的文献和各种工具。
关于python - 快速从句子中提取术语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11557863/