【问题标题】:compare similarity between sets in python比较python中集合之间的相似性
【发布时间】:2023-03-06 01:26:01
【问题描述】:

我在 python 中有两个句子,它们代表用户在输入中作为图像检索软件查询的词集:

sentence1 = "dog is the"
sentence2 = "the dog is a very nice animal"

我有一组带有描述的图片,例如:

sentence3 = "the dog is running in your garden"

我想恢复所有描述与用户插入的查询“非常接近”的图像,但与描述相关的这部分应该在 0 和 1 之间标准化,因为它只是更复杂研究的一部分还考虑了地理标记和图像的低级特征。

鉴于我使用以下方法创建了三个集合:

set_sentence1 = set(sentence1.split())
set_sentence2 = set(sentence2.split())
set_sentence3 = set(sentence3.split())

并将集合之间的交集计算为:

intersection1 = set_sentence1.intersection(set_sentence3)
intersection2 = set_sentence2.intersection(set_sentence3)

如何有效地标准化比较?

我不想使用 levensthein 距离,因为我对字符串相似度不感兴趣,而是对集合相似度感兴趣。

【问题讨论】:

  • 范围 [0,1] 中的值,如果集合相等,则输出 1,如果它们的交集大小为 0,则输出 0。关键是字符串可能具有不同的大小跨度>
  • @user601836,好的,但是您希望示例中的数字是多少? 3/7 和 3/7?
  • 你能解释一下你的任务背景吗?这里的标准化可以通过多种方式完成。您的标准化模式必须反映您的期望。
  • 我会编辑问题
  • 您确定需要设置相似度吗?如果我理解正确,这种任务通常由treating texts as vectors 处理并使用余弦相似度,例如stackoverflow.com/questions/12118720/…

标签: python similarity


【解决方案1】:

可能是这样的指标:

Similarity1 = (1.0 + len(intersection1))/(1.0 + max(len(set_sentence1), len(set_sentence3)))
Similarity2 = (1.0 + len(intersection2))/(1.0 + max(len(set_sentence2), len(set_sentence3)))

【讨论】:

  • 应该是len(set_sentence2)还是len(set_sentence3)?
【解决方案2】:

你试过difflib吗?

来自文档的示例:

>>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n']
>>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n']
>>> for line in context_diff(s1, s2, fromfile='before.py', tofile='after.py'):
...     sys.stdout.write(line)  
*** before.py
--- after.py
***************
*** 1,4 ****
! bacon
! eggs
! ham
  guido
--- 1,4 ----
! python
! eggy
! hamster
  guido

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-16
    • 2010-11-06
    • 2021-10-13
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 2022-07-03
    • 1970-01-01
    相关资源
    最近更新 更多