标签: similarity

使用 Lucene 计算文档相似度的更好方法

我\xe2\x80\x99m 通过在索引时指定 TermVector 来使用 Lucene 索引文档集合。\n然后,我通过读取索引并计算每个文档的 TF-IDF 得分向量来检索术语及其频率。然后,使用 TF-IDF 向量,使用维基百科的余弦相似度方程计算文档之间的成对余弦相似度。

\n\n

这是我的问题:假设我在这个集合中有两个相同的文档 \xe2\x80\x9cA\xe2\x80\x9d 和 \xe2\x80\x9cB\xe2\x80\x9d (A 和 B 有超过 200 个句子)。如果我计算 A 和 B 之间的成对余弦相似度,它会给出余弦值=1,这是完全可以的。但是,如果我从 Doc \xe2\x80\x9cB\xe2\x80\x9d 中删除单个句子,它会给出这两个文档之间的余弦相似度值约为 0.85。这些文档几乎相似,但余弦值却不同。我知道问题出在 I\xe2\x80\x99m 使用的方程上。

\n\n

有没有更好的方法/方程可以用来计算文档之间的余弦相似度?

\n\n

已编辑

\n\n

这就是我计算余弦相似度的方法,doc1[]并且doc2[]是相应文档的 TF-IDF 向量。向量仅包含scores但不包含words

\n\n
private double cosineSimBetweenTwoDocs(float doc1[], float doc2[]) {\n    double temp;\n    int doc1Len = doc1.length;\n    int doc2Len = doc2.length;\n    float numerator = 0;\n    float temSumDoc1 = 0;\n    float temSumDoc2 = 0;\n    double equlideanNormOfDoc1 …
Run Code Online (Sandbox Code Playgroud)

java lucene similarity

3
推荐指数
1
解决办法
6555
查看次数

兰德相似指数和杰卡德相似指数有什么区别?

Rand 和 Jaccard 相似性/验证指数之间的理论差异是什么?

我对方程式不感兴趣,而是对它们差异的解释感兴趣。

我知道杰卡德指数忽略了真阴性,但为什么呢?这会产生什么样的影响?

谢谢

validation statistics probability similarity

3
推荐指数
1
解决办法
2448
查看次数

如何根据文档相似度对文本数据进行分组?

考虑如下数据框

df = pd.DataFrame({'Questions': ['What are you doing?','What are you doing tonight?','What are you doing now?','What is your name?','What is your nick name?','What is your full name?','Shall we meet?',
                             'How are you doing?' ]})
Run Code Online (Sandbox Code Playgroud)
                   问题
0 你在做什么?
1 今晚你做什么?
2 你现在在做什么?
3 你叫什么名字?
4 你的昵称是什么?
5 你的全名是什么?
6 我们见面好吗?
7 你好吗?

如何将具有类似问题的数据框分组?即如何获得如下所示的组

for _, i in df.groupby('similarity')['Questions']:
    print(i,'\n')
Run Code Online (Sandbox Code Playgroud)
6 我们见面好吗?
名称:问题,数据类型:对象

3 你叫什么名字?
4 你的昵称是什么?
5 你的全名是什么?
名称:问题,数据类型:对象

0 你在做什么?
1 今晚你做什么?
2 你现在在做什么?
7 你好吗?
名称:问题,数据类型:对象

这里提出了类似的问题,但不太清楚,所以没有回答这个问题

python group-by similarity nltk pandas

3
推荐指数
1
解决办法
3287
查看次数

quanteda:按行计算两个 DFM 之间的文本相似度

我有一个包含 2 个文本字段的数据框:评论和主帖子

基本上这是结构

         id  comment                        post_text
          1   "I think that blabla.."        "Why is blabla.."
          2   "Well, you should blabla.."    "okay, blabla.."
          3    ...
Run Code Online (Sandbox Code Playgroud)

我想计算第一行注释中的文本与第一行 post_text 中的文本之间的相似度,并对所有行执行此操作。据我所知,我必须为两种类型的文本创建单独的 dfm 对象

          corp1 <- corpus(r , text_field= "comment")
          corp2 <- corpus(r , text_field= "post_text")
          dfm1 <- dfm(corp1)
          dfm2 <- dfm(corp2)
Run Code Online (Sandbox Code Playgroud)

最后,我想获得这样的东西:

id  comment                     post_text          similarity
1   "I think that blabla.."     "Why is blabla.."  *similarity between comment1 and post_text1
2   "Well, you should blabla.." "okay, blabla.."  *similarity between comment2 and post_text2
3    ...
Run Code Online (Sandbox Code Playgroud)

我不知道如何继续,我在 …

nlp r similarity quanteda

3
推荐指数
1
解决办法
1221
查看次数

我们如何在Python中检查两个音频文件的哈希值之间的相似性?

关于数据:我们有 2 个相同的视频文件,这些文件的音频也相同,但质量不同。即分别为 128kbps 和 320kbps。

我们使用 ffmpeg 从视频中提取音频,并使用以下代码生成两个音频文件的哈希值:ffmpeg -loglevel error -i 320kbps.wav -map 0 -f hash - 输出为:SHA256=4c77a4a73f9fa99ee219f0019e99a367c4ab72242623f10d1dc35d12f3be7 26c 同样我们对我们必须比较的另一个音频文件进行了此操作, C:\FFMPEG>ffmpeg -loglevel error -i 128kbps.wav -map 0 -f hash - SHA256=f8ca7622da40473d375765e1d4337bdf035441bbd01187b69e4d059514b2d69a

现在我们知道这些音频文件和哈希值是不同的,但我们想知道它们实际上有多少不同/相似,例如:像 ab 中的某个距离是 3

有人可以帮忙吗?

python audio ffmpeg similarity computer-vision

3
推荐指数
1
解决办法
2248
查看次数

比较阵列之间的距离?

如何比较两个数组之间的相似性?说我有:

Base Array: [.5,0,0,0,.25,0,0,.25,0,0,0,0]

Array 1: [1,0,0,0,1,0,0,1,0,0,0,0]
Array 2: [0,0,1,0,0,0,1,0,0,1,0,0]
Array 3: [1,0,0,0,0,0,0,0,0,0,0,0]
Run Code Online (Sandbox Code Playgroud)

关于上面的数组,答案应该是数组1.答案是数组1,因为数组元素在结构上"更接近"基数组的数组元素.与数组3不同,.25更接近1而不是0.另一个例子:

Base Array: [.75,0,0,0,0,0,0,0,.25,0,0,0]

Array 1: [1,0,0,0,1,0,0,1,0,0,0,0]
Array 2: [0,0,1,0,0,0,1,0,0,1,0,0]
Array 3: [1,0,0,0,0,0,0,0,0,0,0,0]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,阵列3应该是答案.

然而,使用我当前的算法(我将在稍后给出),答案变为数组3.这是我正在使用的:

for (int i = 0; i < basearray.Length; i++)
{
  temp = (basearray[i] - arrayX[i]);
  dist += temp * temp;
}
Run Code Online (Sandbox Code Playgroud)

所以,我认为我的算法出了问题?或许,我需要使用'不同'的算法而不是距离(因为基本上,.25 IS接近0比1,但我想要的是其他).

谢谢!

更新:

我找到了答案!感谢所有人的帮助.这里是:

float[] pbaseArrX = new float[3];
float[] pcompArrX = new float[3];

float dist1 = 0, dist2 = 0;

for (int i = 0; i < baseArrX.Count; i++) …
Run Code Online (Sandbox Code Playgroud)

c# algorithm similarity

2
推荐指数
1
解决办法
1947
查看次数

Mahout布尔基于用户的推荐器的相似度函数

我正在使用Mahout构建一个基于用户的推荐系统,该系统使用布尔数据进行操作.

我使用GenericBooleanPrefUserBasedRecommender,NearestNUserNeighborhood现在试图决定最合适的用户相似度函数.

有人建议使用LogLikelihoodSimilarityTanimotoCoefficientSimilarity.我试过这两种情况,并在两种情况下得到[主观评估]有意义的结果.但是,LogLikehood对同一数据集的RMSE评级更好.在这两种情况下,"无推荐"的数量相似.

任何人都可以推荐哪种相似功能最适合这种情况?

similarity collaborative-filtering mahout

2
推荐指数
1
解决办法
2721
查看次数

你如何对字符串进行排序,使得字谜在C++中彼此接近?

它实际上是用Java实现的,因为你可以使用Comparator和内置方法对字符数组进行排序并比较这样的字符串:

public class AnagramComparator implements Comparator<String> {
 public String sortChars(String s) {
   char[] content = s.toCharArray();
   Arrays.sort(content);
   return new String(content);
 }

public int compare(String s1, String s2) {
   return sortChars(s1).compareTo(sortChars(s2));
 }
}
Run Code Online (Sandbox Code Playgroud)

但我想知道如何在C++中实现它?编写上述Java代码中使用的内置方法的C++等价物绝对是一种选择.还有其他智能方式吗?

c++ sorting string similarity anagram

2
推荐指数
1
解决办法
1161
查看次数

用于自动完成字段的类似UTF-8字符串

背景

用户可以键入名称,系统应与文本匹配,即使用户输入或数据库字段包含重音(UTF-8)字符也是如此.这是使用该pg_trgm模块.

问题

代码类似于以下内容:

  SELECT
    t.label
  FROM
    the_table t
  WHERE
    label % 'fil'
  ORDER BY
    similarity( t.label, 'fil' ) DESC
Run Code Online (Sandbox Code Playgroud)

当用户键入时fil,查询匹配filbert但不匹配filé powder.(因为重音字符?)

解决方案#1失败

我试图实现一个unaccent函数并将查询重写为:

  SELECT
    t.label
  FROM
    the_table t
  WHERE
    unaccent( label ) % unaccent( 'fil' )
  ORDER BY
    similarity( unaccent( t.label ), unaccent( 'fil' ) ) DESC
Run Code Online (Sandbox Code Playgroud)

这只返回filbert.

解决方案#2失败

建议:

CREATE EXTENSION pg_trgm;
CREATE EXTENSION unaccent;

CREATE OR REPLACE FUNCTION unaccent_text(text)
  RETURNS text AS
$BODY$
  SELECT unaccent($1); …
Run Code Online (Sandbox Code Playgroud)

postgresql similarity utf-8 plpgsql string-comparison

2
推荐指数
1
解决办法
2167
查看次数

检查多列的值是否相同(python)

我有一个binairy数据帧,我想检查特定行中的所有值是否具有值1.所以例如我有数据帧.由于第0行和第2行在col1到col3中都包含值1,因此结果应为1,如果不是,则应为0.

import pandas as pd
d = {'col1': [1, 0,1,0], 'col2': [1, 0,1, 1], 'col3': [1,0,1,1], 'outcome': [1,0,1,0]}
df = pd.DataFrame(data=d)
Run Code Online (Sandbox Code Playgroud)

由于我自己的数据框架要大得多,我正在寻找比以下更优雅的方式,任何想法?

def similar(x):
    if x['col1'] == 1 and x['col2'] == 1 and x['col3'] == 1:
        return 1
    else:
        ''
df['outcome'] = df.apply(similar, axis=1)
Run Code Online (Sandbox Code Playgroud)

python similarity pandas

2
推荐指数
1
解决办法
1504
查看次数