假设我们有买家和卖家试图在市场中找到对方.买家可以用关键字标记他们的需求; 卖家也可以为他们卖的东西做同样的事情.我有兴趣根据两个关键字集找到根据特定买方的相关性对卖家进行排名的算法.
这是一个例子:
buyer_keywords = {"furry", "four legs", "likes catnip", "has claws"}
Run Code Online (Sandbox Code Playgroud)
然后我们有两个潜在的卖家,我们需要根据其相关性对订单进行排名:
seller_keywords[1] = {"furry", "four legs", "arctic circle", "white"}
seller_keywords[2] = {"likes catnip", "furry",
"hates mice", "yarn-lover", "whiskers"}
Run Code Online (Sandbox Code Playgroud)
如果我们只使用关键字的交集,我们就不会有太多歧视:两个关键字都相交.如果我们将交集计数除以集合联合的大小,则卖方2实际上会因为关键字数量更多而变得更糟.这似乎会为任何不纠正关键字集大小的方法引入自动惩罚(我们绝对不想惩罚添加关键字).
为了对问题采取更多结构,假设我们对关键字属性的强度有一些真实的衡量标准(每个卖方必须加1),例如:
seller_keywords[1] = {"furry":.05,
"four legs":.05,
"arctic circle":.8,
"white":.1}
seller_keywords[2] = {"likes catnip":.5,
"furry":.4,
"hates mice":.02,
"yarn-lover":.02,
"whiskers":.06}
Run Code Online (Sandbox Code Playgroud)
现在我们可以总结命中的价值:所以现在卖家1只获得.1的得分,而卖家2的得分为.9.到目前为止,这么好,但现在我们可能会让第三个卖家拥有一个非常有限的非描述性关键字集:
seller_keywords[3] = {"furry":1}
Run Code Online (Sandbox Code Playgroud)
对于他们唯一关键字的任何打击,这会将他们弹到顶部,这是不好的.
无论如何,我的猜测(和希望)是这是一个相当普遍的问题,并且存在具有已知优势和局限性的不同算法解决方案.这可能是CS101中涵盖的内容,所以我认为这个问题的一个好答案可能只是相关参考文献的链接.
我有两个矩阵,A(维度M x N)和B(N x P).实际上,它们是矢量的集合-以行向量,列向量中B.我想获得对于每对余弦相似性得分a和b,其中a是从矩阵A的向量(行)和b从矩阵的向量(列) B.
我已经开始乘以矩阵,这导致矩阵C(维数M x P).
C = A*B.
然而,为了获得余弦相似性得分,我需要将每个值除以C(i,j)两个相应矢量的范数.你能在Matlab中建议最简单的方法吗?
我正在计算两个特征向量之间的余弦相似度,并想知道是否有人可能对下面的分类特征问题有一个巧妙的解决方案.
目前我有(例子):
# define the similarity function
cosineSim <- function(x){
as.matrix(x%*%t(x)/(sqrt(rowSums(x^2) %*% t(rowSums(x^2)))))
}
# define some feature vectors
A <- c(1,1,0,0.5)
B <- c(1,1,0,0.5)
C <- c(1,1,0,1.2)
D <- c(1,0,0,0.7)
dataTest <- data.frame(A,B,C,D)
dataTest <- data.frame(t(dataTest))
dataMatrix <- as.matrix(dataTest)
# get similarity matrix
cosineSim(dataMatrix)
Run Code Online (Sandbox Code Playgroud)
哪个工作正常.
但是我想要添加一个分类变量(例如city)来生成一个特征,当两个城市相等时为1,另一个则为0.
在这种情况下,示例特征向量将是:
A <- c(1,1,0,0.5,"Dublin")
B <- c(1,1,0,0.5,"London")
C <- c(1,1,0,1.2,"Dublin")
D <- c(1,0,0,0.7,"New York")
Run Code Online (Sandbox Code Playgroud)
我想知道是否有一种巧妙的方法可以在函数内动态生成最后一个特征的成对等式,从而使它成为一个矢量化实现?
我已经尝试过预处理为每个类别制作二进制标志,以便上面的例子会变成如下:
A <- c(1,1,0,0.5,1,0,0)
B <- c(1,1,0,0.5,0,1,0)
C <- c(1,1,0,1.2,1,0,0)
D <- c(1,0,0,0.7,0,0,1)
Run Code Online (Sandbox Code Playgroud)
这有效,但问题是它意味着我必须预先处理每个变量,在某些情况下,我可以看到类别的数量变得非常大.当我想要的只是产生一个为相等而返回1的特征时,这似乎相当昂贵/效率低,否则为0(在这里授予复杂性,因为它本质上是一个依赖于两个记录并在它们之间共享的特征).
我可以看到的一个解决方案就是编写一个循环来构建每对特征向量(我可以构建一个特征,如[is_same_city] = 1/0,当我们有相等时为每个向量设置为1,否则为0)然后得到距离 - …
r vectorization binary-data cosine-similarity categorical-data
我已经定义了两个矩阵,如下所示:
from scipy import linalg, mat, dot
a = mat([-0.711,0.730])
b = mat([-1.099,0.124])
Run Code Online (Sandbox Code Playgroud)
现在,我想计算这两个矩阵的余弦相似度.以下代码有什么问题.它给了我一个错误objects are not aligned
c = dot(a,b)/np.linalg.norm(a)/np.linalg.norm(b)
Run Code Online (Sandbox Code Playgroud) 我想计算两个列表的余弦相似度,如下所示:
A = [u'home (private)', u'bank', u'bank', u'building(condo/apartment)','factory']
B = [u'home (private)', u'school', u'bank', u'shopping mall']
Run Code Online (Sandbox Code Playgroud)
我知道 A 和 B 的余弦相似度应该是
3/(sqrt(7)*sqrt(4)).
Run Code Online (Sandbox Code Playgroud)
我尝试将列表改成“home bank bank building factory”这样的形式,看起来像一个句子,但是,有些元素(例如home(私人))本身有空格,有些元素有括号,所以我觉得很难计算单词出现次数。
您知道如何计算这个复杂列表中的单词出现次数,以便对于列表 B,单词出现次数可以表示为
{'home (private):1, 'school':1, 'bank': 1, 'shopping mall':1}?
Run Code Online (Sandbox Code Playgroud)
或者你知道如何计算这两个列表的余弦相似度吗?
非常感谢
我正在尝试破译 elasticsearch 响应中的解释 API。但是有点失落。对我来说有点难以遵循。任何简单的指针或链接将更具体地解释 JSON?我对 VSM 中的 TF、IDF 和余弦相似度有所了解。但更具体地需要一些关于 JSON 的指针。理想的情况是,如果我能找到对这个 JSON 的解释作为一个简单的数学表达式。
{
"_explanation": {
"value": 7.937373,
"description": "sum of:",
"details": [
{
"value": 2.4789724,
"description": "weight(FirstName:M80806 in 35) [PerFieldSimilarity], result of:",
"details": [
{
"value": 2.4789724,
"description": "score(doc=35,freq=1.0), product of:",
"details": [
{
"value": 0.37350902,
"description": "queryWeight, product of:",
"details": [
{
"value": 6.6369815,
"description": "idf(docFreq=720, maxDocs=202323)"
},
{
"value": 0.056276944,
"description": "queryNorm"
}
]
},
{
"value": 6.6369815,
"description": "fieldWeight in 35, product of:",
"details": [
{ …Run Code Online (Sandbox Code Playgroud) 我正在处理十万(100,000)份文件(平均文件长度约为 500 个术语)。对于每个文档,我想通过余弦相似度获得前 k 个(例如 k = 5)个相似文档。那么如何通过Python有效地做到这一点。
这是我所做的:
我在 i5-2.5GHz 上运行我的代码,12 小时过去了,但它仍然有效。所以我想知道如何优化我的代码或程序。
这是我的想法:
那么,你有什么好主意吗?
非常感谢。
我知道有一个类似的问题,但这不是我想要的。
感谢 @orange ,经过分析,我发现第 2 步是瓶颈!这是示例代码:
def construct_dt_matrix():
dt_matrix = pd.DataFrame(columns=['docid'])
docid = 0
for f in files:
# text segmentation for f
# remove stop words
# word count store …Run Code Online (Sandbox Code Playgroud)
TF-IDF并且Cosine Similarity是文本聚类的常用组合.每个文档由TF-IDF权重的向量表示.
这就是我的教科书所说的.
使用余弦相似度,您可以计算这些文档之间的相似性.
但为什么这些技术一起使用呢?
有什么好处?
可以使用例如Jaccard Similarity吗?
我知道,它是如何工作的,但我想知道,为什么这些技术正是如此.
linguistics data-mining text-mining tf-idf cosine-similarity
在python中,是否有一种矢量化的有效方法来计算稀疏数组u到稀疏矩阵的余弦距离v,从而得到[1, 2, ..., n]对应于的元素数组cosine(u,v[0]), cosine(u,v[1]), ..., cosine(u, v[n])?
我有一个问题,需要cosine similarities在形状 (1, 300) 的 numpy 数组和形状 (5000000, 300) 的矩阵之间进行计算。我尝试了多种不同风格的代码,现在我想知道是否有办法大幅减少运行时间:
版本 1:我将我的大矩阵分成 5 个大小为 1Mil 的较小矩阵:
from scipy import spatial
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
def cos_matrix_multiplication(vector,matrix_1):
v = vector.reshape(1, -1)
scores1=spatial.distance.cdist(matrix_1, v, 'cosine')
return((scores1[:1]))
pool = ThreadPoolExecutor(8)
URLS=[mat_small1,mat_small2,mat_small3,mat_small4,mat_small5]
neighbors=[]
with concurrent.futures.ThreadPoolExecutor(max_workers=30) as executor:
# Start the load operations and mark each future with its URL
future_to_url = {executor.submit(cos_matrix_multiplication,vec,mat_col): mat_col for mat_col in URLS}
for future in concurrent.futures.as_completed(future_to_url):
url = future_to_url[future]
data = future.result()
neighbors.append(data)
Run Code Online (Sandbox Code Playgroud)
运行时间:2.48 秒
版本 …
python ×5
tf-idf ×3
algorithm ×2
matrix ×2
binary-data ×1
cuda ×1
data-mining ×1
e-commerce ×1
gpu ×1
keyword ×1
linguistics ×1
list ×1
lucene ×1
matching ×1
matlab ×1
numba ×1
numpy ×1
r ×1
string ×1
text-mining ×1