我\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
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) Rand 和 Jaccard 相似性/验证指数之间的理论差异是什么?
我对方程式不感兴趣,而是对它们差异的解释感兴趣。
我知道杰卡德指数忽略了真阴性,但为什么呢?这会产生什么样的影响?
谢谢
考虑如下数据框
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 你好吗? 名称:问题,数据类型:对象
这里提出了类似的问题,但不太清楚,所以没有回答这个问题
我有一个包含 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)
我不知道如何继续,我在 …
关于数据:我们有 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
有人可以帮忙吗?
如何比较两个数组之间的相似性?说我有:
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) 我正在使用Mahout构建一个基于用户的推荐系统,该系统使用布尔数据进行操作.
我使用GenericBooleanPrefUserBasedRecommender,NearestNUserNeighborhood现在试图决定最合适的用户相似度函数.
有人建议使用LogLikelihoodSimilarity或TanimotoCoefficientSimilarity.我试过这两种情况,并在两种情况下得到[主观评估]有意义的结果.但是,LogLikehood对同一数据集的RMSE评级更好.在这两种情况下,"无推荐"的数量相似.
任何人都可以推荐哪种相似功能最适合这种情况?
它实际上是用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++等价物绝对是一种选择.还有其他智能方式吗?
用户可以键入名称,系统应与文本匹配,即使用户输入或数据库字段包含重音(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.(因为重音字符?)
我试图实现一个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.
建议:
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) 我有一个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) similarity ×10
python ×3
pandas ×2
algorithm ×1
anagram ×1
audio ×1
c# ×1
c++ ×1
ffmpeg ×1
group-by ×1
java ×1
lucene ×1
mahout ×1
nlp ×1
nltk ×1
plpgsql ×1
postgresql ×1
probability ×1
quanteda ×1
r ×1
sorting ×1
statistics ×1
string ×1
utf-8 ×1
validation ×1