【问题标题】:Distinguishing between terms of different domains区分不同领域的术语
【发布时间】:2014-12-22 14:08:59
【问题描述】:

我想做的事:

我正在尝试列出术语并区分它们来自哪个域。例如,“肠”来自解剖学领域,而术语“癌症”来自疾病领域。我从 DOID 和 FMA 等不同的本体中获得这些术语(它们可以在 bioportal.bioontology.org 找到)

问题:

我很难找到实现这一点的最佳方法。目前,我天真地从本体 DOID 和 FMA 中获取术语,并从 DOID 列表中获取我们知道是解剖学的 FMA 列表中的任何术语的差异(其中包含可能是解剖学的术语,例如结肠癌,结肠是解剖学的和癌症是疾病)。

想法:

我在想我可以获取不同术语域的词根、前缀和后缀,并尝试将其与列表中的术语匹配。另一个想法是从他们的本体中获取更多信息,例如元数据或其他东西,并使用它来区分术语。

欢迎任何想法。

【问题讨论】:

    标签: list dictionary nlp ontology


    【解决方案1】:

    作为第一次运行,您可能会在使用二元组时获得最好的运气。作为最初的假设,疾病通常是名词短语,并且通常具有非常特定于英语的结构,其中NP -> N N,如“肝癌”,意思与“肝癌”大致相同。医生倾向于不使用后者,而前者应该很好地用二元组捕获。

    使用您拥有的两个本体作为起点来训练某种二元模型。就像 Rcynic 建议的那样,您可以计算它们并得出概率。 Naive Bayes classifier 在这里可以很好地工作。特征是二元组;类是解剖学或疾病。 sklearn 内置了朴素贝叶斯。“朴素”部分意味着,在这种情况下,你所有的二元组都是相互独立的。这个假设从根本上说是错误的,但它在很多情况下都很好用,所以我们假装它是真的。

    这不会完美运行。由于这是您的第一次通过,您应该准备好探查输出,以了解它是如何得出答案的,并找到失败的案例。当您发现错误趋势时,请调整您的模型,然后重试。

    我不会在这里推荐 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']
    

    其中只有一个是您真正感兴趣的。作为零假设,WordNet 有 80% 的可能性会添加噪音,而不是知识。

    【讨论】:

      【解决方案2】:

      天真的方法 - 它为您带来了什么样的精度和召回率?如果您现在设置一个测试用例,那么您可以在应用更复杂的方法时跟踪您的进度。

      我不知道您要处理的初始设置是什么 - 但可以尝试的一件事是获取带注释的文档(也许使用机械土耳其人)。需要将文档标记为您要查找的域 - 解剖学或疾病。

      然后计数和除法将告诉您遇到的单词属于某个域的可能性有多大。下一步是调整一些权重。

      另一种方法(完全不同的方向)是使用 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') , 同义词集('cancer.n.05')]

      http://wordnetweb.princeton.edu/perl/webwn

      让我们知道结果如何。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-06
        • 2020-08-05
        • 2015-11-16
        • 2015-08-24
        相关资源
        最近更新 更多