【问题标题】:semantic similarity in medical terms医学术语的语义相似性
【发布时间】:2018-03-05 17:28:16
【问题描述】:

我想在两个拼写错误较多的列表中找出相似的临床术语。现在我正在使用 SequenceMatcher 来发现它最相似。示例:

from difflib import SequenceMatcher
def similar(a, b):
    return round(SequenceMatcher(None, a, b).ratio()*100, 1)

print similar('hypertesnion','hypertension')          # 91.7
print similar('high blood pressure','hypertension')   # 19.4

在第二种情况下,“高血压”和“高血压”之间的相似性非常低,但它们实际上是相似的术语。另请注意,列表中的“高血压”和“高血压”有多种拼写形式。

有什么方法可以发现这些临床术语的相似性?

我想有两件事是必需的。先纠正拼写,再编码 将它们转换为单个词来计算相似度。

编辑: 或者有什么方法可以使用同义词列表创建模型以将它们编码为单个术语,以防我有一个列表示例编码如下:

'hypertension' 'hypertension'
'hypertesnio' 'hypertension'
'high blood pressure' 'hypertension'
'increased blood pressure' 'hypertension'
'raised blodd presure' 'hypertension'

【问题讨论】:

  • 除非您有某种字典,否则在 python 或 nltk 中没有简单的方法可以做到这一点,@BillBell 建议的 UMLS 将是将不同的单词映射到其语义等效术语的最佳来源。另外你也可以看看bioportal.bioontology.org
  • 谢谢@BillBell。假设我有一个列表(有问题的示例已更新),我现在如何使用它来即兴进行相似性搜索。

标签: python scikit-learn nltk topic-modeling text-processing


【解决方案1】:

您应该探索使用 word2vec 以及使用它们带来的相似性见解和单词之间的关系。大多数 NLP 库都支持 word2vec,我在 http://bio.nlplab.org/ 找到了一个经过医学数据训练的模型。可能还有其他 word2vec 模型可以与 Spacy、sklearn 等库一起用于医疗保健领域的相似性匹配。

正如您已经指出的那样,您仍然需要单独解决拼写错误

【讨论】:

    【解决方案2】:

    这是一种公认​​的有缺陷的方法,它采用症状列表,您可能会发现它们记录在临床试验中,然后将它们变成根据某些标准可能可接受的列表。

    symptoms = [
        'hyprtension',
        'hi blood pressure',
        'high blod pressure',
        'increased blood pressure',
        'bad headache',
        'migraine',
        'migraine headache',
        'mygrain',
        ]
    
    canonical_inverted_dictionary = {
        'high blood pressure': 'hypertension',
        'increased blood pressure': 'hypertension',
        'hypersion': 'hypertension',
        'migraine': 'migraine',
        }
    
    from difflib import SequenceMatcher
    
    def mapper(raw_term, threshold=0.7):
        best = 0
        for term in canonical_inverted_dictionary:
            ratio = SequenceMatcher(None, raw_term, canonical_inverted_dictionary[term]).ratio()
            if ratio > best:
                best = ratio
                best_item = term
        if best > threshold:
            return canonical_inverted_dictionary[best_item]
    
    for symptom in symptoms:
        print (symptom, mapper(symptom))
    

    输出是这样的:

    hyprtension hypertension
    hi blood pressure None
    high blod pressure None
    increased blood pressure None
    bad headache None
    migraine migraine
    migraine headache None
    mygrain migraine
    

    简单地说,SequenceMatcher 并不能真正胜任使用自然语言的任务。它无法辨别“高血压”与“高血压”相似。但是,这段代码确实说明了一个原则。就是这样,您可以使用代码将诸如“hi blood pressure”之类的短语“识别”为“high blood pressure”,然后使用倒排字典将它们转换为一些标准术语,例如“hypertension”。

    我怀疑在很多情况下都可以做到这一点,在实践中,通过使用词干分析器拆分传入的术语,然后寻找单词的合法替代词,最后在倒排词典中查找这些词。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 2020-12-21
      • 2016-02-20
      • 1970-01-01
      • 2015-06-13
      • 2015-10-27
      • 2020-07-11
      相关资源
      最近更新 更多