首页 > 解决方案 > 您可以使用文本相似性搜索相关的数据库表/字段吗?

问题描述

我正在做一个大学项目,我需要将一个字符串与其他字符串列表进行比较。我想知道我们是否有任何类型的图书馆可以做到这一点。

假设我有一个名为: DOCTORS_DETAILS 的表

其他表名是:HOSPITAL_DEPARTMENTS、DOCTOR_APPOINTMENTS、PATIENT_DETAILS、PAYMENTS 等。

现在我想计算其中哪一个与 DOCTOR_DETAILS 更相关?预期输出可以是,

DOCTOR_APPOINTMENTS - More relevant because of the term doctor matches in both string

PATIENT_DETAILS - The term DETAILS present in both string

HOSPITAL_DEPARTMENTS - least relevant

PAYMENTS - least relevant 

因此,我想根据两个有问题的字符串上存在的相似术语的数量来找到相关性。

例如:DOCTOR_DETAILS -> DOCTOR_APPOITMENT(1/2) > DOCTOR_ADDRESS_INFORMATION(1/3) > DOCTOR_SPECILIZATION_DEGREE_INFORMATION (1/4) > PATIENT_INFO (0/2)

标签: machine-learningnlpprediction

解决方案


语义相似性是一个常见的 NLP 问题。有多种方法可供研究,但它们的核心都将归结为:

  1. 把每一段文字变成一个向量
  2. 测量向量之间的距离,并称更近的向量更相似

执行步骤 1 的三种可能方法是:

要执行第 2 步,您几乎可以肯定要使用余弦距离。使用 Python 非常简单,这是博客文章中的一个实现:

import numpy as np

def cos_sim(a, b):
    """Takes 2 vectors a, b and returns the cosine similarity according 
    to the definition of the dot product
    """
    dot_product = np.dot(a, b)
    norm_a = np.linalg.norm(a)
    norm_b = np.linalg.norm(b)
    return dot_product / (norm_a * norm_b)

对于您的特定用例,我的直觉是使用 fasttext。所以,官方网站展示了如何下载一些预训练的词向量,但是你会想要下载一个预训练的模型(参见这个 GH 问题,使用 https://dl.fbaipublicfiles.com/fasttext/vectors-english/wiki-news- 300d-1M-subword.bin.zip ),

然后你会想要做类似的事情:

import fasttext

model = fasttext.load_model("model_filename.bin")


def order_tables_by_name_similarity(main_table, candidate_tables):
    '''Note: we use a fasttext model, not just pretrained vectors, so we get subword information
    you can modify this to also output the distances if you need them
    '''
    main_v = model[main_table]
    similarity_to_main = lambda w: cos_sim(main_v, model[w])
    return sorted(candidate_tables, key=similarity_to_main, reverse=True)

order_tables_by_name_similarity("DOCTORS_DETAILS", ["HOSPITAL_DEPARTMENTS", "DOCTOR_APPOINTMENTS", "PATIENT_DETAILS", "PAYMENTS"])

# outputs: ['PATIENT_DETAILS', 'DOCTOR_APPOINTMENTS', 'HOSPITAL_DEPARTMENTS', 'PAYMENTS']

如果您需要将其投入生产,那么巨大的模型大小(6.7GB)可能是个问题。那时,您需要构建自己的模型,并限制模型大小。您可能可以从 6MB 模型中获得大致相同的精度!


推荐阅读