我要做的是:
我正在尝试列出一个术语列表,并区分它们来自哪个域。例如"肠道"将来自解剖学领域,而术语"癌症"将来自疾病领域。我从不同的本体获得这些术语,如DOID和FMA(可以在bioportal.bioontology.org找到)
问题:
我很难实现实现此目的的最佳方法。目前,我天真地从本体DOID和FMA中获取术语,并对FMA列表中的任何术语进行区分,我们知道这些术语是从DOID列表中解剖的(其中包含可能是解剖学的术语,例如结肠癌,结肠是解剖学的)和癌症是疾病。)
思想:
我想我可以为不同的术语域获取根词,前缀和后缀,并尝试将其与列表中的术语匹配。另一个想法是从他们的本体中获取更多信息,例如元数据或其他东西,并使用它来区分术语。
欢迎任何想法。
答案 0 :(得分:1)
天真的方法 - 它给你的精确度和召回率是多少?如果您现在设置测试用例,则可以在应用更复杂的方法时跟踪进度。
我不知道你正在处理什么样的初始设置 - 但是要尝试的一件事是接触带注释的文件(也许使用机械土耳其人)。这些文件需要被标记为您正在寻找的领域 - 解剖学或疾病。
然后count和divide将告诉您遇到的单词是否有可能属于某个域。下一步是调整一些权重。
另一种方法(朝着另一个方向发展)是使用WordNet。我不知道它是否对你的目的有用,但它是一个庞大的本体 - 所以它可能有所帮助。
Python有绑定通过nltk使用Wordnet。
从nltk.corpus导入wordnet作为wn
wn.synsets( '癌症')
给出输出= [Synset('cancer.n.01'),Synset('cancer.n.02'),Synset('cancer.n.03'),Synset('cancer.n.04') ,Synset('cancer.n.05')]
http://wordnetweb.princeton.edu/perl/webwn
让我们知道它是如何运作的。
答案 1 :(得分:1)
作为第一次运行,你可能会有最好的运气与bigrams。作为最初的假设,疾病通常是名词短语,并且通常具有非常英语特定的结构,其中NP -> N N
,如肝癌和#34;这意味着与癌症大致相同的东西肝脏。"医生倾向于不使用后者,而前者应该很好地抓住了双胞胎。
使用你在那里的两个本体作为训练某种二元模型的起点。像Rcynic建议的那样,你可以将它们计算在内并得出概率。 Naive Bayes classifier在这里可以很好地工作。这些特征是双子星;课程是解剖学或疾病。 sklearn内置了Naive Bayes。"天真的"在这种情况下,部分意味着所有的双字母都是彼此独立的。这种假设从根本上说是错误的,但它在很多情况下都很有效,所以我们假装它是正确的。
这不会很完美。因为它是你的第一次传递,你应该准备探测输出,以了解它是如何得出它所发现的答案并找到失败的案例。当您发现错误趋势时,请调整模型,然后重试。
我不会在这里推荐WordNet。它不是由医生编写的,因为你所做的事情依赖于精确的医学术语,它可能会增加奇怪的含义。从nltk.corpus.wordnet
:
>>> livers = reader.synsets("liver")
>>> pprint([l.definition() for l in livers])
[u'large and complicated reddish-brown glandular organ located in the upper right portion of the abdominal cavity; secretes bile and functions in metabolism of protein and carbohydrate and fat; synthesizes substances involved in the clotting of the blood; synthesizes vitamin A; detoxifies poisonous substances and breaks down worn-out erythrocytes',
u'liver of an animal used as meat',
u'a person who has a special life style',
u'someone who lives in a place',
u'having a reddish-brown color']
您真正感兴趣的只有其中一个。作为一个零假设,有80%的机会会增加噪音,而不是知识。