我想在两个列表中找出类似的临床术语,并且拼写错误很多。现在我使用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'
答案 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并非真正完成使用自然语言的任务。它无法辨别“喜血压”与“高血压”相似。但是,这段代码确实说明了一个原则。就是这样,您可以使用代码“识别”诸如“高血压”之类的短语作为“高血压”,然后使用倒置字典将这些短语转换为某些标准术语,如“高血压”。
我怀疑在很多情况下可能会这样做,在实践中,通过使用词干分割器来分割传入的术语,然后寻找单词的合法替代词,最后在倒置字典中查找它们。