我在做一个大学项目,需要将一个字符串与其他字符串列表进行比较。我想知道是否有任何可以执行此操作的库。
假设我有一个名为:DOCTORS_DETAILS的表
其他表名包括:HOSPITAL_DEPARTMENTS,DOCTOR_APPOINTMENTS,PATIENT_DETAILS,PAYMENTS等。
现在我想计算这些表中哪些与DOCTOR_DETAILS更相关?预期输出可以是,
DOCTOR_APPOINTMENTS - 更相关,因为术语doctor在两个字符串中匹配PATIENT_DETAILS - 术语DETAILS在两个字符串中出现HOSPITAL_DEPARTMENTS - 最不相关PAYMENTS - 最不相关
因此,我想根据两个字符串中存在的相似术语的数量来确定相关性。
例如:DOCTOR_DETAILS -> DOCTOR_APPOITMENT(1/2) > DOCTOR_ADDRESS_INFORMATION(1/3) > DOCTOR_SPECILIZATION_DEGREE_INFORMATION (1/4) > PATIENT_INFO (0/2)
回答:
语义相似性是一个常见的NLP问题。有多种方法可以研究,但它们的核心都将归结为:
- 将每段文本转换为向量
- 测量向量之间的距离,并称距离较近的向量更相似
执行第一步的三种可能方法是:
要执行第二步,您几乎肯定希望使用余弦距离。在Python中这非常简单,这里是从博客文章中摘取的一个实现:
import numpy as npdef 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),
然后您可能需要做类似这样的事情:
如果您需要将此应用于生产环境,巨大的模型大小(6.7GB)可能会成为问题。届时,您需要构建自己的模型,并限制模型大小。您可能会从一个6MB的模型中获得大致相同的准确性!