- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试将 Fast Word Mover 的距离库与 SpaCy 结合使用,对于 GitHub 中的相同示例
import spacy
import wmd
nlp = spacy.load('en_core_web_md')
nlp.add_pipe(wmd.WMD.SpacySimilarityHook(nlp), last=True)
doc1 = nlp("Politician speaks to the media in Illinois.")
doc2 = nlp("The president greets the press in Chicago.")
print(doc1.similarity(doc2))
结果是:
6.070106029510498
我不知道如何解释它,因为通常距离是标准化的(0 到 1)。在自述文件中,此结果不可用,因此我不确定我的结果是否错误或此测量的比例不同。
最佳答案
一个简短的回答:不要解释它。就像这样使用它:距离越小,句子越相似。对于几乎所有实际应用(例如 KNN),这就足够了。
现在长答案:单词移动距离(阅读 the paper )定义为“不间断”单词的最佳匹配对之间距离的加权平均值。所以如果你想把它归一化为 (0, 1),你需要用这个最好的总和除以它的最坏情况。
问题是在 spacy
中词向量没有标准化(通过打印 [sum(t.vector**2) for t in doc1]
检查)。因此,它们之间的最大距离是无限的。如果你对它们进行规范化,新的 WMD 将不会等同于原始的 WMD(即它会以不同的方式对文本对进行排序)。因此,没有明显的方法可以标准化您演示的原始 spacy-WMD 距离。
现在让我们假设词向量是单位归一化的。如果是这样,那么两个单词之间的最大距离就是一个单位球体的直径(即2)。而很多2的最大加权平均还是2。所以需要将文本之间的距离除以2,使其完全归一化。
您可以通过继承您使用的类,将词向量归一化构建到 WMD 计算中:
import wmd
import numpy
import libwmdrelax
class NormalizedWMDHook(wmd.WMD.SpacySimilarityHook):
def compute_similarity(self, doc1, doc2):
"""
Calculates the similarity between two spaCy documents. Extracts the
nBOW from them and evaluates the WMD.
:return: The calculated similarity.
:rtype: float.
"""
doc1 = self._convert_document(doc1)
doc2 = self._convert_document(doc2)
vocabulary = {
w: i for i, w in enumerate(sorted(set(doc1).union(doc2)))}
w1 = self._generate_weights(doc1, vocabulary)
w2 = self._generate_weights(doc2, vocabulary)
evec = numpy.zeros((len(vocabulary), self.nlp.vocab.vectors_length),
dtype=numpy.float32)
for w, i in vocabulary.items():
v = self.nlp.vocab[w].vector # MODIFIED
evec[i] = v / (sum(v**2)**0.5) # MODIFIED
evec_sqr = (evec * evec).sum(axis=1)
dists = evec_sqr - 2 * evec.dot(evec.T) + evec_sqr[:, numpy.newaxis]
dists[dists < 0] = 0
dists = numpy.sqrt(dists)
return libwmdrelax.emd(w1, w2, dists) / 2 # MODIFIED
现在您可以确定您的距离已正确归一化:
import spacy
nlp = spacy.load('en_core_web_md')
nlp.add_pipe(NormalizedWMDHook(nlp), last=True)
doc1 = nlp("Politician speaks to the media in Illinois.")
doc2 = nlp("The president greets the press in Chicago.")
print(doc1.similarity(doc2))
print(doc1.similarity(doc1))
print(doc1.similarity(nlp("President speaks to the media in Illinois.")))
print(doc1.similarity(nlp("some irrelevant bullshit")))
print(doc1.similarity(nlp("JDL")))
现在的结果是
0.469503253698349
0.0
0.12690649926662445
0.6037049889564514
0.7507566213607788
附言你可以看到,即使在两个非常不相关的文本之间,这个归一化距离也远小于 1。这是因为实际上词向量并没有覆盖整个单位球体——相反,它们中的大部分都聚集在它上面的几个“大陆”上。因此,即使是非常不同的文本之间的距离通常也小于 1。
关于python - Word Mover 距离与 SpaCy 的非标准化结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56822056/
添加“重力”会使物体最终消失 老实说我找不到这个错误。 搬运工类 class Mover { PVector acc; PVector loc; PVector vel; Mover(
我想计算两个二维阵列之间的地球移动距离(这些不是图像)。 现在我浏览了两个库:scipy ( https://docs.scipy.org/doc/scipy/reference/generated/
我想在调用 mOver(obj) 时显示图像: function mOver(obj) { obj.innerHTML = "Thank You" } function mOut(obj)
根据大规模杀伤性武器paper 、旅行成本或单词对之间的欧氏距离的计算方式如下图所示。 这个距离是按特定顺序成对计算的吗?如图所示,每个文档中的第一个、第二个等等或者奥巴马的距离是根据 D0 中的所有
我正在尝试使用 WMD 计算 2 个文本的相似度。我尝试使用 gensim 在 Python 3 中使用以下代码: word2vec_model = gensim.models.KeyedVector
我正在尝试使用函数 EMD 确定任意 2 个直方图之间可能存在的最大距离是多少|在 OpenCV 中。 原因是我需要归一化(在 [0,1] 范围内缩放它们,0 = 相同的直方图,1 = 可能的最不同的
我正在尝试将 Fast Word Mover 的距离库与 SpaCy 结合使用,对于 GitHub 中的相同示例 import spacy import wmd nlp = spacy.load('e
我在 Mac OS ML 下的 OpenCV 2.4.2 中调用 EMD() 时遇到问题。 我有一个类,其属性 Mat _signature 定义如下: Mat _signature(size,dim
我正在使用 gensim wmdistance 来计算引用句子和 1000 个其他句子之间的相似度。 model = gensim.models.KeyedVectors.load_word2
我想计算两个点云之间的 Earth Mover 距离作为 Tensorflow 中的损失函数。 pointclouds1 = tf.placeholder(tf.float32, shape=(bat
我在 Keras/Tensrflow 中找到了 Earth Mover Loss 的代码。我想计算给图像的分数的损失,但在我了解下面给出的 Earth Mover Loss 的工作之前,我无法做到这一
我正在研究 Sprite 移动器,但是,它似乎不起作用,有人可以看一下并告诉我出了什么问题吗?它应该通过 KeyListener 工作,以便用箭头键移动 Sprite ,但是,我的移动功能只能向上移动
尝试编译自动生成的示例测试(使用标准 haxelib run munit gen 制作,然后使用 haxelib run munit t 运行,带或不带 -coverage)用于 HaxeFlixel
我正在尝试使用基于 Google's BERT 的词嵌入来计算两个任意文档的文档相似性(最近邻) .为了从 Bert 获得词嵌入,我使用 bert-as-a-service .文档相似度应基于 Wor
我想使用 Azure 资源移动器将公司的 Azure SQL Server 资源移动到新区域(从西欧到法国中部)。我想知道这个过程是否会导致任何数据丢失。特别是在数据复制过程中,如果复制数据库时保存的
我想使用 Azure 资源移动器将公司的 Azure SQL Server 资源移动到新区域(从西欧到法国中部)。我想知道这个过程是否会导致任何数据丢失。特别是在数据复制过程中,如果复制数据库时保存的
我正在尝试实现谷歌的 NIMA 研究论文,他们对图像质量进行评分。我正在使用 TID2013 数据集。我有 3000 张图像,每张图像的分数从 0.00 到 9.00 df.head() >> Ima
我是一名优秀的程序员,十分优秀!