在python中,为了比较单个单词或双字符,获得精确文本相似性的最佳方法是什么?

2024-06-08 07:10:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我在products_a数组和products_b数组中都有类似的产品数据:

products_a = [{color: "White", size: "2' 3\""}, {color: "Blue", size: "5' 8\""} ]
products_b = [{color: "Black", size: "2' 3\""}, {color: "Sky blue", size: "5' 8\""} ]

我希望能够准确地说出两个数组中颜色之间的相似性,分数在01之间。例如,比较"Blue""Sky blue"应该在1.00附近评分(可能类似于0.78或类似)

空间相似性

我尝试使用spacy来解决这个问题:

import spacy
nlp = spacy.load('en_core_web_sm')

def similarityscore(text1, text2 ):
    doc1 = nlp( text1 )
    doc2 = nlp( text2 )
    similarity = doc1.similarity( doc2 )
    return similarity

是的,当"Blue""Sky blue"传球时,得分为0.6545742918773636。好的,但是当针对"Black"传入"White"时会发生什么?分数是0.8176945362451089。。。正如斯帕西所说"White""Black"的比例约为81%相似!当试图确保产品颜色不相似时,这是一个失败

贾卡相似性

我试着用这个来{}对抗{}对抗{},得到了{}的分数(可能在单个单词上做得太多了,但未来更大的小体还有空间):

# remove punctuation and lowercase all words function
def simplify_text(text):
    for punctuation in ['.', ',', '!', '?', '"']:
        text = text.replace(punctuation, '')
    return text.lower()

# Jaccard function
def jaccardSimilarity(text_a, text_b ):
    word_set_a, word_set_b = [set(self.simplify_text(text).split())
                                for text in [text_a, text_b]]
    num_shared = len(word_set_a & word_set_b)
    num_total = len(word_set_a | word_set_b)
    jaccard = num_shared / num_total
    return jaccard

我不能接受在{}和{}上获得不同的{}和{}分数。我一直在寻找更准确的方法来解决这个问题。即使取两者的平均值也不准确。如果你有更好的办法,请告诉我


Tags: textsizeblue数组相似性num分数word
3条回答

我发现了一些可能有用的方法。我是编程新手,所以不知道如何实现数据集。还是想和大家分享

from difflib import SequenceMatcher
#https://towardsdatascience.com/sequencematcher-in-python-6b1e6f3915fc

s1 = "blue"
s2 = "sky blue"
sim = SequenceMatcher(None, s1, s2).ratio()
print("Similarity between two strings is: " + str(sim) )

此代码表示两个字符串之间的相似性为:0.666666。我试着用同样的代码写黑白。它说两个字符串之间的相似性是:0.0

注: 我认为Sklearn模块亲和力传播和Levenstein距离可能会有所帮助。但我不知道如何将它们应用到你的问题中

Gensim有一个Word2Vec的Python实现,它提供了单词相似性

from gensim.models import Word2Vec
model = Word2Vec.load(path/to/your/model)
model.wv.similarity('Chennai', 'London')

如果您的实际目标是处理产品描述上的颜色,您应该将其视为一个分类问题,不过请注意,对于短文本来说,这将非常困难。幸运的是,大多数物品都应该使用普通的颜色,所以不难获得良好的覆盖率。我怀疑挑选12种左右的颜色并将其分类比制作好的颜色名称嵌入要容易

我会而不是使用像Jaccard distance这样的字符串距离度量。它们只是告诉你两个字符串之间有多少字母或词块是相同的,它们没有任何意义

正如评论中提到的,普通的词向量不会为你找到相反的词。你可以阅读更多关于为什么这很难的内容。使用颜色名称词嵌入的建议非常好,是获得相似性分数的最佳方法

相关问题 更多 >

    热门问题