已知已知重复对的余弦相似度

时间:2017-04-20 17:53:57

标签: python nlp tf-idf cosine-similarity spacy

我有一个csv文件中保存的重复文档对列表。第1列中的每个ID都与第2列中的相应ID重复。 该文件是这样的:

Document_ID1    Document_ID2
12345           87565
34546           45633
56453           78645
35667           67856
13636           67845

每个文档ID都与其他地方保存的文本相关联。我拉了这个文本并将每列ID和相关文本保存到两个lsm数据库中 所以我db1Document_ID1的所有ID作为,并将相应的文本作为各个键的。因此,就像一本字典。同样,db2来自Document_ID2的所有ID 所以,当我说db1[12345]时,我会得到与ID 12345相关联的文字。

现在,我想获得每个对之间的余弦相似性分数,以确定它们的重复性。到目前为止,我运行了一个tfidf模型来做同样的事情。我创建了一个tfidf矩阵,其中db1中的所有文档都作为语料库,我测量了db2中每个tfidf向量与tfidf矩阵的余弦相似度。出于安全考虑,我无法提供完整的代码。代码是这样的:

# Generator function to pick one key (document) at a time for comparison against other documents
def generator(db):
    for key in db.keys():
        text = db[key]
        yield text

# Use spaCy to create a function to preprocess text from the generator function
nlp = spacy.load('en')
def spacy(generator_object):
    for doc in generator_object:
        words = <code to make words lower case, remove stop words, spaces and punctuations>
        yield u' '.join(words)

# TF-IDF Vectorizer
tfidf = TfidfVectorizer(min_df = 2)

# Applying tf-idf transformer to each key from db1 individually in the generator function.
tfidf_matrix = tfidf.fit_transform(spacy(generator(db1)))

# Function to calculate cosine similarity values between the tfidf matrix and the tfidf vector of a new key
def similarity(tfidf_vector, tfidf_matrix, keys):    
    sim_vec = <code to get cosine similarity>
    return sim_vec.sort_values(ascending=False)

# Applying tf-idf transformer on db2 keys on a loop and getting cosine similarity scores for each key from db2.
for key in db2.keys():
    # Create a new temporary db for each key from db2 to enter into generator function
    new = <code to create a temporary new lsm database>
    text = db2[key]
    new[key] = text
    new_key = <code to get next key from the temporary new lsm database>
    tfidf_vector = tfidf.transform(spacy_proc(corpus_gen(new)))
    similarity_values = similarity(tfidf_vector, tfidf_matrix, list(db1.keys()))
    for idx, i in similarity_values.iteritems(): 
            print new_key, idx, i
    del new[key]

但是这给了我db2中db2中每个键的所有键的余弦相似度得分。示例:如果db1中有5个密钥,db2中有5个密钥,则使用此代码得到25行。
我想要的是从db1获取db2中的密钥的相应密钥的余弦相似度得分。这意味着如果db1和db2中每个都有5个键,那么我应该只有5行 - 每对重复项的余弦相似度得分。

如何调整我的代码以获得是什么?

1 个答案:

答案 0 :(得分:0)

因为,还没有明确的答案,我得到的数据框包含所有行(上面示例中的25行结果)和内部连接/合并它的数据框重复对的列表(即我需要的5行输出)。这样,结果数据帧具有重复文档对的相似性分数。 这是一个临时解决方案。如果有人能提出更清洁的解决方案,我会接受这个答案,如果有效的话。