医学术语中的语义相似性

时间:2018-03-05 17:28:17

标签: python scikit-learn nltk topic-modeling python-textprocessing

我想在两个列表中找出类似的临床术语,并且拼写错误很多。现在我使用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'

2 个答案:

答案 0 :(得分:1)

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

您仍然需要单独解决拼写错误,因为您已经指出

答案 1 :(得分:1)

这是一个公认的有缺陷的方法,它会列出一系列症状,因为您可能会发现它们在临床试验中被记录下来,并根据某些标准将它们变成可接受的列表。

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并非真正完成使用自然语言的任务。它无法辨别“喜血压”与“高血压”相似。但是,这段代码确实说明了一个原则。就是这样,您可以使用代码“识别”诸如“高血压”之类的短语作为“高血压”,然后使用倒置字典将这些短语转换为某些标准术语,如“高血压”。

我怀疑在很多情况下可能会这样做,在实践中,通过使用词干分割器来分割传入的术语,然后寻找单词的合法替代词,最后在倒置字典中查找它们。