是猫猫子吖 2025-09-16 11:19 采纳率: 63.6%
浏览 13

计算文本相似度算法推荐

请问一下各位,想要找一个计算文本相似度的算法,我的数据是纯英文文本,大概有两千多万条没有标注的文本,有没有推荐的算法呀。目前在考虑SBERT下的预训练模型,主要包括SimCSE、all-mpnet-base-v2、all-MiniLM-L6-v2这三类代表性模型。

  • 写回答

6条回答 默认 最新

  • 阿里嘎多学长 2025-09-16 11:19
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    文本相似度算法推荐

    您需要计算两千多万条英文文本的相似度,考虑使用预训练模型是正确的选择,特别是SBERT下面的模型。以下是一些推荐:

    • SimCSE: 这是SimCSE模型的一种特定预训练方案,使用contrastive学习方案对文本语义表示进行训练,可以在保持好语义表示的同时,提高文本的稀疏化。
    • all-mpnet-base-v2: 这基于MPNet预训练模型,MPNet模型的优势在于它采用全局自注意力机制(Global Attention)来捕捉长距依赖关系,相比BERT等模型它对长句子处理更好,有条件的情况下可以考虑使用。
    • 其他选项: 还有不少其他的模型和算法可以使用,如FastText, Tfidf等,具体选用哪个模型最好,建议在实验中进行验证,并且可以结合您的评估指标来优化模型。
    • 数据准备: 需要注意的是您的数据量非常大,数据处理和分词需要考虑使用分布式处理来提高效率。
    • 算法评估: 在模型选择后,还需要评估这些模型的表现,您可以使用准确率、F1等指标来评估这些模型的结果。
    # 简单的示例,用于计算两个文本的相似度
    import torch
    from transformers import AutoModel, AutoTokenizer
    import numpy as np
    
    def text_similar(text1, text2, model_name):
        # 加载预训练模型和分词器
        model = AutoModel.from_pretrained(model_name)
        tokenizer = AutoTokenizer.from_pretrained(model_name)
        
        # 对文本进行分词
        encoding = tokenizer.encode_plus(
            text1, 
            text2, 
            add_special_tokens=True, 
            max_length=512, 
            return_attention_mask=True, 
            return_tensors='pt'
        )
        
        # 获取模型输出的向量表示
        outputs = model(**encoding)
        
        # 计算两个向量的余弦相似度
        sim = torch.cosine_similarity(outputs.last_hidden_state[:, 0], outputs.last_hidden_state[:, 1])
        
        return sim.item()
    
    # example
    model_name = "sentence-bert/simcse-sbert-base-nli-mean-tokens"
    text1 = "这是一个例子文本"
    text2 = "这是另一个例子文本"
    sim = text_similar(text1, text2, model_name)
    print(f"文本相似度:{sim}")
    
    评论

报告相同问题?

问题事件

  • 创建了问题 9月16日