Pandas 熊猫:计算所有类别的平均相似性

Pandas 熊猫:计算所有类别的平均相似性,pandas,average,similarity,across,Pandas,Average,Similarity,Across,我有一个数据帧,如下所示,但更大: 将熊猫作为pd导入 数据={'First':['First value','Third value','Second value','First value','Third value','Second value'], ‘第二’:[‘老人在这儿’、‘年轻姑娘在那儿’、‘老太太在这儿’、‘年轻小伙子在那儿’、‘年轻姑娘在这儿’、‘老姑娘在这儿’] df=pd.DataFrame(数据,列=['First','Second']) 我在第一列计算了每个可能对之间

我有一个数据帧,如下所示,但更大:

将熊猫作为pd导入
数据={'First':['First value','Third value','Second value','First value','Third value','Second value'],
‘第二’:[‘老人在这儿’、‘年轻姑娘在那儿’、‘老太太在这儿’、‘年轻小伙子在那儿’、‘年轻姑娘在这儿’、‘老姑娘在这儿’]
df=pd.DataFrame(数据,列=['First','Second'])
我在第一列计算了每个可能对之间的平均相似性,如下所示(从stackoverflow中的其他答案获得了这部分的帮助):

我想要的输出是所有对的平均值,例如,如果上面的代码有以下输出:

similarity between first value and second value is 60
similarity between first value and third value is 50 
similarity between second value and third value is 55
similarity between second value and first value is 60
similarity between third value and first value is 50
similarity between third value and second value is 55
我想得到第一个值与任意组合的平均分,第二个值与任意组合的平均分,第三个值与任意组合的平均分,如下所示:

first value average across all possible values is 55
second value average across all possible values is 57.5
third value average across all possible values is  52.5

编辑:根据你的评论,这里是你可以做的

  • 首先计算
    data\u相似度
    表,该表组合了组中不同句子的标记
  • 计算句子之间的成对相似元组
  • 将它们放入一个数据框,然后按整个组分组并取平均值

  • 你有多个“第二个值”,用不同的句子,这意味着什么?第一列的含义是什么?第一列只是一个标签列是的,但是第一个值和第二个值之间的相似性是60意味着什么?因为第一个值有两个不同的句子和第二个值相关。(first_value_1,first_value 2)和(second_value_1,second_value_2)是的,但我已通过groupby函数将每个标签的句子分组到dataframe的一行中,因此数据相似性只有三行。请检查我的解决方案,并让我知道这是否是您需要的
    grouped_similarity
    是您需要的具有3行的数据集。
    first value average across all possible values is 55
    second value average across all possible values is 57.5
    third value average across all possible values is  52.5
    
    import nltk
    from itertools import combinations, product
    
    #function to calculate similarity between each pairs of documents 
    def similarity_measure(doc1, doc2): 
    
        words_doc1 = set(doc1) 
        words_doc2 = set(doc2)
    
        intersection = words_doc1.intersection(words_doc2)
        union = words_doc1.union(words_doc2)
        
        return float (len(intersection)) / len(union) * 100
    
    #getting the lemmatized text along side the intents
    data_similarity= df.groupby('First')['Second'].apply(lambda x:  nltk.tokenize.word_tokenize(' '.join(x)))
    data_similarity = data_similarity.reset_index()
    
    all_pairs = [(i,l,similarity_measure(j,m)) for (i,j),(l,m) in 
                 product(zip(data_similarity['First'], data_similarity['Second']), repeat=2) if i!=l]
    
    pair_similarity = pd.DataFrame(all_pairs, columns=['A','B','Similarity'])
    group_similarity = pair_similarity.groupby(['A'])['Similarity'].mean().reset_index()
    print(group_similarity)
    
                  A  Similarity
    0   First value   47.777778
    1  Second value   45.000000
    2   Third value   52.777778