首页 > 其他分享 >nlp文本匹配任务

nlp文本匹配任务

时间:2024-11-25 18:11:50浏览次数:8  
标签:nlp 匹配 doc self len 文档 idf word 文本

  • 传统文本匹配方法
  1. 编辑距离: 两个字符串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
    代码实现思路(动态规划思想)
def minDistance(self, word1: str, word2: str) -> int:
        n = len(word1)
        m = len(word2)

        # 有一个字符串为空串
        if n * m == 0:
            return n + m

        # DP 数组
        D = [ [0] * (m + 1) for _ in range(n + 1)]

        # 边界状态初始化
        for i in range(n + 1):
            D[i][0] = i
        for j in range(m + 1):
            D[0][j] = j

        # 计算所有 DP 值
        for i in range(1, n + 1):
            for j in range(1, m + 1):
                left = D[i - 1][j] + 1
                down = D[i][j - 1] + 1
                left_down = D[i - 1][j - 1] 
                if word1[i - 1] != word2[j - 1]:
                    left_down += 1
                D[i][j] = min(left, down, left_down)

        return D[n][m]
来源:力扣(LeetCode)
  1. Jaccard相似度:
    image
  • 代码实现:
# jaccard距离
def jaccard_distance(string1, string2):
    return 1 - len(set(string1) & set(string2)) / len(set(string1) | set(string2))

# 基于jaccard相似度
def similarity_based_on_jaccard_distance(string1, string2):
    return 1 - jaccard_distance(string1, string2)
  1. TF·IDF:.
    image

  2. BM25算法:

image

  • 代码实现:
import math
from typing import Dict, List


class BM25:
    EPSILON = 0.25
    PARAM_K1 = 1.5  # BM25算法中超参数
    PARAM_B = 0.6  # BM25算法中超参数

    def __init__(self, corpus: Dict):
        """
            初始化BM25模型
            :param corpus: 文档集, 文档集合应该是字典形式,key为文档的唯一标识,val对应其文本内容,文本内容需要分词成列表
        """

        self.corpus_size = 0  # 文档数量
        self.wordNumsOfAllDoc = 0  # 用于计算文档集合中平均每篇文档的词数 -> wordNumsOfAllDoc / corpus_size
        self.doc_freqs = {}  # 记录每篇文档中查询词的词频
        self.idf = {}  # 记录查询词的 IDF
        self.doc_len = {}  # 记录每篇文档的单词数
        self.docContainedWord = {}  # 包含单词 word 的文档集合
        self._initialize(corpus)

    def _initialize(self, corpus: Dict):
        """
            根据语料库构建倒排索引
        """
        # nd = {} # word -> number of documents containing the word
        for index, document in corpus.items():
            self.corpus_size += 1
            self.doc_len[index] = len(document)  # 文档的单词数
            self.wordNumsOfAllDoc += len(document)

            frequencies = {}  # 一篇文档中单词出现的频率
            for word in document:
                if word not in frequencies:
                    frequencies[word] = 0
                frequencies[word] += 1
            self.doc_freqs[index] = frequencies

            # 构建词到文档的倒排索引,将包含单词的和文档和包含关系进行反向映射
            for word in frequencies.keys():
                if word not in self.docContainedWord:
                    self.docContainedWord[word] = set()
                self.docContainedWord[word].add(index)

        # 计算 idf
        idf_sum = 0  # collect idf sum to calculate an average idf for epsilon value
        negative_idfs = []
        for word in self.docContainedWord.keys():
            doc_nums_contained_word = len(self.docContainedWord[word])
            idf = math.log(self.corpus_size - doc_nums_contained_word +
                           0.5) - math.log(doc_nums_contained_word + 0.5)
            self.idf[word] = idf
            idf_sum += idf
            if idf < 0:
                negative_idfs.append(word)

        average_idf = float(idf_sum) / len(self.idf)
        eps = BM25.EPSILON * average_idf
        for word in negative_idfs:
            self.idf[word] = eps

    @property
    def avgdl(self):
        return float(self.wordNumsOfAllDoc) / self.corpus_size

    def get_score(self, query: List, doc_index):
        """
        计算查询 q 和文档 d 的相关性分数
        :param query: 查询词列表
        :param doc_index: 为语料库中某篇文档对应的索引
        """
        k1 = BM25.PARAM_K1
        b = BM25.PARAM_B
        score = 0
        doc_freqs = self.doc_freqs[doc_index]
        for word in query:
            if word not in doc_freqs:
                continue
            score += self.idf[word] * doc_freqs[word] * (k1 + 1) / (
                    doc_freqs[word] + k1 * (1 - b + b * self.doc_len[doc_index] / self.avgdl))
        return [doc_index, score]

    def get_scores(self, query):
        scores = [self.get_score(query, index) for index in self.doc_len.keys()]
        return scores
  • 基于深度学习
  1. 表示型文本匹配: 表示型文本匹配方法主要基于对文本进行独立表示,将每个文本转换为一个固定维度的向量,然后通过计算向量之间的相似性(如点积、余弦相似度)来判断文本匹配程度。
    image
    image
    image
    image
    def cosine_distance(tensor1, tensor2):
        tensor1 = torch.nn.functional.normalize(tensor1, dim=-1)
        tensor2 = torch.nn.functional.normalize(tensor2, dim=-1)
        cosine = torch.sum(torch.mul(tensor1, tensor2), axis=-1)
        return 1 - cosine

    def cosine_triplet_loss(self, a, p, n, margin=None):
        ap = cosine_distance(a, p)
        an = cosine_distance(a, n)
        if margin is None:
            diff = ap - an + 0.1
        else:
            diff = ap - an + margin.squeeze()
        return torch.mean(diff[diff.gt(0)])
  1. 交互型文本匹配 交互型文本匹配方法通过在文本之间建立直接交互来捕捉更细粒度的匹配信息,通常将两个文本联合输入模型,依赖模型学习复杂的交互关系。
    image

标签:nlp,匹配,doc,self,len,文档,idf,word,文本
From: https://www.cnblogs.com/yyyccs/p/18562759

相关文章

  • NLP论文速读(ECCV2024)|面向文生图的Parrot优化的多奖励强化学习
    论文速读|Parrot:Pareto-optimalMulti-RewardReinforcementLearningFrameworkforText-to-ImageGeneration论文信息:简介:   本文背景是文本到图像(Text-to-Image,T2I)生成领域,这是一个旨在根据给定的文本提示生成相应图像的技术领域。尽管该领域取得了显著进......
  • 【NLP高频面题 - LLM架构篇】什么是旋转位置编码(RoPE)?
    【NLP高频面题-LLM架构篇】什么是旋转位置编码(RoPE)?重要性:★★★......
  • 从0学网安之HTML(超文本标记语言)基础
    声明!学习视频来自B站up主**泷羽sec**有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!有兴趣的小伙伴可以点击下面连接进入b站主页[B站......
  • CritiCS:智能协作下的创意长篇故事生成框架 | EMNLP'24
    来源:晓飞的算法工程笔记公众号,转载请注明出处论文:CollectiveCriticsforCreativeStoryGeneration论文地址:https://arxiv.org/abs/2410.02428创新点提出了\({\ttCritiCS}\)的框架,旨在通过基于创造力标准的集体评议,创造性地增强故事计划和文本表现力。通过实......
  • OpenCV-Python 特征匹配
    37.1Brute-Force匹配的基础蛮力匹配器是很简单的。首先在第一幅图像中选取一个关键点然后依次与第二幅图像的每个关键点进行(描述符)距离测试,最后返回距离最近的关键点。对于BF匹配器,我们首先要使用cv2.BFMatcher()创建一个BFMatcher对象。它有两个可选参数。第......
  • 说说你对富文本的理解,你有用过哪些富文本编辑器呢?
    我对富文本的理解是,它是一种比纯文本更丰富的文本格式,允许包含格式化元素,例如字体样式(粗体、斜体、下划线)、字体大小、颜色、列表(有序和无序)、表格、图像、链接、视频、甚至是代码块等等。这与纯文本形成对比,纯文本只包含字符、空格和换行符,没有任何格式化信息。从前端开发的角......
  • 你知道富文本编辑器的实现原理吗?
    富文本编辑器的实现原理比较复杂,涉及到多个方面,核心在于如何将用户输入的文本转换为带有格式的HTML代码,并在编辑区域内实时展示和编辑。以下是一些关键点:1.内容存储和表示:HTML:大多数富文本编辑器使用HTML作为底层的数据格式。用户输入的文本和样式都会被转换为HTML......
  • 【Mybatis与Spring整合】Java项目中占位符与大小写匹配规范的重要性
    在开发Java项目时,细节决定成败。一次不经意的占位符书写错误或大小写不匹配可能导致项目运行失败。本文基于实际问题,总结了占位符配置规范和解决办法,希望为大家提供参考。一、Spring占位符配置问题在Spring项目中,<context:property-placeholder>标签用于加载外部配置文件并......
  • 第2.2 AI文本—小说篇(下)
    无论使用AI文本工具生成任何内容,如果想生成内容效果好,都不开你在该领域有良好的基本功。例如:我们看到下面小说的框架就是台湾著名小说作者许荣哲在《小说课》中讲的一个框架。即使我们没有很好表达,你编写的小说也有跌宕起伏。小说框架:问题一:主人公的“目标”是什么?问题......
  • 字节 NLP 算法岗一面面试题7道(含解析)
    最近这一两周不少互联网公司都已经开始秋招提前批面试了。不同以往的是,当前职场环境已不再是那个双向奔赴时代了。求职者在变多,HC在变少,岗位要求还更高了。最近,我们又陆续整理了很多大厂的面试题,帮助一些球友解惑答疑,分享技术面试中的那些弯弯绕绕。总结如下:《大模型面......