国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

適用于TTS語音處理項目的召回模型:詞袋模型究竟是個啥?和語義召回相比有什么優劣? 原創

發布于 2024-11-13 15:13
瀏覽
0收藏

在人工智能的眾多應用中,對于文檔的準確召回是一個廣泛使用的需求。例如,在基于閱讀理解的問答系統(RAG)中,我們常常通過嵌入模型生成向量來進行語義方面的召回,這種方法已經證明了其效果良好。然而,這并不意味著該方法適用于所有場景。

讓我們考慮一個涉及語音處理的項目,用戶可能會說出需要查詢的內容,系統需要迅速召回與用戶語音輸入相關的文檔。在這種情況下,系統的響應時間變得至關重要,任何延遲都可能影響用戶體驗。對于這類需求,詞袋模型可能成為一種更有利的選擇,因為它無需處理復雜的語義關系,從而可以提供更快速的響應。所以,選擇何種模型取決于具體的應用情景和性能要求。

什么是詞袋模型

詞袋模型是一種文本處理方法,先通過構建一個有序詞表(字典),包含訓練樣本中所有的不重復詞匯。然后,根據此詞表遍歷每個樣本,如果某詞在樣本中出現則出現次數加1,否則次數設置為0。這樣,每個樣本都可以向量化成一個長度等于詞表長度的向量。這么說可能有一點抽象,讓我們來看一個例子,比如有兩個文本:

  • s1:"John likes to watch movies, Mary likes movies too"
  • s2:"John also likes to watch football games"

首先,構建詞匯表 ,這兩個句子形成的詞表(不去停用詞)為:

[‘also’, ‘football’, ‘games’, ‘john’, ‘likes’, ‘mary’, ‘movies’, ‘to’, ‘too’, ‘watch’]

然后,對于每個文本,統計詞匯表中每個單詞的出現次數或者頻率:

適用于TTS語音處理項目的召回模型:詞袋模型究竟是個啥?和語義召回相比有什么優劣?-AI.x社區

BOW詞向量

詞袋模型處理流程

詞袋模型的處理流程可以總結為以下3步:

  1. 首先進行文本分詞
  2. 然后創建一個包含所有獨特詞匯的詞表,保證每個詞語僅出現一次,并固定其位置
  3. 最后,將每個樣本向量化,即遍歷每個樣本,統計詞匯表中每個單詞的出現次數

可以看出在經過向量化后,每個樣本的特征維度長度等于詞表長度。這種方法能覆蓋所有樣本中的詞匯,但可能導致維度災難,因為一個通常大小的中文數據集可能包含數萬個詞匯,意味著向量的維度也相應大。因此,在分詞后,我們通常統計每個詞在數據集中的出現次數,并僅選擇出現頻率最高的前K個詞作為最終詞表。最后,會移除無意義的停用詞,如“的”,“啊”,“了”等。

代碼實現

手動擼代碼

文本分詞

向量化的第一步是分詞。我們將介紹一個常用的開源分詞工具,jieba。在使用jieba之前,需要先進行安裝,可以進入相應的虛擬環境并使用命令??pip install jieba??完成安裝。

import jieba, re
cut_all = False


def cutWords(s, cut_all=False):
    cut_words = []
    # 將所有字母、數字、冒號、逗號、句號等過濾掉
    s = re.sub("[A-Za-z0-9\:\·\—\,\。\“ \”]", "", s)
    seg_list = jieba.cut(s, cut_all=cut_all)
    cut_words.append("/".join(seg_list))

cut_all 參數可以指定分詞模式,當??cut_all = False???時,表示普通分詞模式,設置為??True??后,便可以開啟全分詞模式。

構建詞表

分詞后通常還會進行詞頻統計,以便選取出現頻率最高的前K個詞來構造詞表。對詞頻進行統計需要使用另外一個包collection中的??Counter??計數器。

import re
from collections import Counter
import jieba


def wordsCount(s):
    # 初始化空字符串用于存儲分詞結果
    cut_words = ""
    
    # 使用正則表達式移除非中文字符
    s = re.sub("[A-Za-z0-9\:\·\—\,\。\“ \”]", "", s)
    
    # 使用jieba進行分詞,并連接結果
    seg_list = jieba.cut(s, cut_all=False)
    cut_words += (" ".join(seg_list))
    
    # 將分詞結果分割成列表
    all_words = cut_words.split()
    
    # 初始化計數器
    c = Counter()
    
    # 遍歷所有單詞,長度大于1且不是換行符則進行計數
    for x in all_words:
        if len(x) > 1 and x != '\r\n':
            c[x] += 1
    
    # 創建一個詞匯列表
    vocab = []
    
    print('\n詞頻統計結果:')
    # 打印并收集出現頻率最高的前5個詞
    for (k, v) in c.most_common(5): 
        print("%s:%d" % (k, v))
        vocab.append(k)
    
    # 打印詞匯列表
    print("詞表:", vocab)

詞頻統計

def vectorization_with_freq(s):
    # 此處接文本分詞和詞頻統計代碼,需要生成詞表vocab和文本x_text
    
    # 初始化空列表用于存儲向量化結果
    x_vec = []
    
    # 遍歷文本中的每項
    for item in x_text:
        # 對詞表中的每個詞創建一個字典,初始化頻率為0
        tmp = dict(zip(vocab, [0] * len(vocab)))
        
        # 遍歷此項中的每個詞
        for w in item:
            # 如果詞在詞表中,則頻率加1
            if w in vocab:
                tmp[w] += 1
                
        # 將該項的向量添加到向量化結果列表
        x_vec.append(list(tmp.values()))
    
    # 打印詞表、文本和向量化結果
    print("詞表:", vocab)
    print("文本:", x_text)
    print(x_vec)

這段Python代碼定義了一個函數??vectorization_with_freq(s)???,它接受一個字符串??s??作為輸入,然后使用詞頻方法對其進行向量化處理。

sklearn實現

在實踐中,我們可以直接使用sklearn庫,它已經實現了上述功能,無需手動編寫復雜的代碼。

from sklearn.feature_extraction.text import CountVectorizer
corpus = [
    "John likes to watch movies, Mary likes movies too",
    "John also likes to watch football games",
]
bag_of_words = CountVectorizer(
            ngram_range=(1, 2), token_pattern="(?u)\\b\\w+\\b", binary=True
        ).fit(corpus)
vectors = bag_of_words.transform(corpus)
print(vectors)


"""
 (0, 5)	1
  (0, 7)	1
  (0, 8)	1
  (0, 9)	1
  (0, 10)	1
  (0, 11)	1
  (0, 12)	1
  (0, 13)	1
  (0, 14)	1
  (0, 15)	1
  (0, 16)	1
  (0, 17)	1
  (0, 18)	1
  (0, 19)	1
  (0, 21)	1
  (1, 0)	1
  (1, 1)	1
  (1, 2)	1
  (1, 3)	1
  (1, 4)	1
  (1, 5)	1
  (1, 6)	1
  (1, 8)	1
  (1, 10)	1
  (1, 16)	1
  (1, 17)	1
  (1, 19)	1
  (1, 20)	1
"""

??CountVectorizer??是scikit-learn庫中的一個類,用于將文本轉換為詞項頻率向量。下面解釋你提到的這些參數。

  1. ngram_range: 它定義了從文本中提取的 n-gram 的大小范圍。N-gram 是 n 個連續的單詞。例如,對于句子"我愛北京",當 ngram_range=(1,2),則會提取出 unigrams(單詞)和 bigrams(兩個連續的單詞)。即,"我","愛","北京","我愛","愛北京"。
  2. token_pattern: 這是一個正則表達式,它定義了什么構成一個“單詞”。"(?u)\b\w+\b"表示一個或多個unicode字符或數字并以邊界分隔。例如,對于句子"I love Beijing",tokens 是["I", "love", "Beijing"]。
  3. binary: 如果設置為 True,所有非零計數都設為 1。這意味著輸出的結果只表示單詞是否在文檔中出現(被設為1),而不是單詞出現的次數。例如,對于句子"I love love Beijing",如果 binary=True,那么每個單詞無論出現一次或多次,結果都記作出現過,"love": 1,而不是"love": 2。

fit

??CountVectorizer.fit()??是scikit-learn庫中的一個方法,用于學習輸入文本集合(通常是一組文檔)中所有單詞的詞匯表。這個過程也被稱為“擬合”數據。

例如,如果我們有三個文檔:["The sky is blue", "The sun is bright", "The sun in the sky is bright"],??fit()??函數會生成一個詞匯表,包含所有不重復的單詞:['The', 'sky', 'is', 'blue', 'sun', 'bright', 'in']。

這個詞匯表隨后可以??于將新的(或相同的)文檔轉換成向量,其中每個元素表示相應單詞在文檔中出現的頻次。這是通過??transform()???函數實現的,也經常和??fit()???方法一起使用,如??fit_transform()??。

輸出

??CountVectorizer???的輸出是一個稀疏矩陣,其中每一行表示corpus中的一個文檔,每一列對應于??CountVectorizer??擬合后得到的詞匯表中的一個單詞。在你的例子中,你有兩個文檔,所以你有兩行。

每個元組 ??(i, j)??? 的值代表了詞匯表中第 ??j??? 個單詞在第 ??i??? 個文檔中出現的頻率。因為你設置 ??binary=True??, 所以這個頻率只能是0或1,表示該單詞在相應的文檔中是否出現。

例如,在你給出的輸出中,??(0, 5) 1?? 表示詞匯表中的第5個單詞在第一個文檔("John likes to watch movies, Mary likes movies too")中出現了(至少一次)。

類似地,??(1, 0) 1?? 表示詞匯表中的第0個單詞在第二個文檔("John also likes to watch football games")中出現了。

注意,此處的索引是從0開始的,而且可能看不到某些索引,這是因為對應的詞在相應的文檔中沒有出現,頻率為零,而這種信息在稀疏矩陣中通常會被省略,以節省存儲空間。

應用

在基于回答生成的閱讀理解系統(RAG)中,文檔召回是核心的一步。這個過程主要依賴于檢索和標定與用戶查詢相關性最高的文檔。傳統的RAG應用主要通過語義和關鍵字匹配來執行此操作,這通常需要使用embedding模型。具體來說,我們會將文本輸入到模型中,得到每個文檔或查詢的嵌入向量表示,然后計算它們之間的相似度。

除了上述方法外,我們還可以使用基于詞袋模型的召回策略。詞袋模型將文檔轉換為一個向量,其中每個元素對應于特定單詞或短語在文檔中出現的頻率。通過比較這些向量,我們可以確定文檔之間的相似度。例如,我們可以通過計算余弦相似度來衡量兩個向量的相似程度,這種方法允許我們找到與給定查詢最相關的前K個文檔。

import numpy as np
from nltk.stem import PorterStemmer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import check_pairwise_arrays, normalize, safe_sparse_dot




stemmer = PorterStemmer()




class Vectorizer:
    @staticmethod
    def stem(text):
        # 詞干化
        words = text.split()
        stemmed_words = [stemmer.stem(word) for word in words]
        sentence = " ".join(stemmed_words)
        sentence = sentence
        return sentence


    def __init__(self, corpus):
        self.bag_of_words = CountVectorizer(
            ngram_range=(1, 2), token_pattern="(?u)\\b\\w+\\b", binary=True
        ).fit(corpus)
        self.vectors = self.bag_of_words.transform(corpus)
        self.corpus = corpus


    @staticmethod
    def cosine_similarity(X, Y=None, dense_output=True):
        X, Y = check_pairwise_arrays(X, Y)
        X_normalized = normalize(X, copy=True)
        if X is Y:
            Y_normalized = X_normalized
        else:
            Y_normalized = normalize(Y, copy=True)
        return safe_sparse_dot(
            X_normalized,
            Y_normalized.T,
            dense_output=dense_output)


    def get_relevent_docs(self, query, top_k=3, theshold=0):
        stem_query = self.stem(query)
        query_vectors = self.bag_of_words.transform([stem_query])
        cos_sim = self.cosine_similarity(self.vectors, query_vectors)
        indices = np.argpartition(cos_sim[:, 0], -top_k)[-top_k:]
        result = []
        for i in range(len(indices) - 1, -1, -1):
            idx = indices[i]
            score = cos_sim[idx, 0]
            if score > theshold:
                result.append([score, idx])
        result.sort(key=lambda x: x[0], reverse=True)  # 相似度降序排序后返回


        return result

兩種召回方案對比

基于語義+關鍵字模型的召回

此模型結合了關鍵字搜索和語義搜索。通常,該模型使用詞嵌入(如Word2Vec,GloVe,BERT等)來表示文檔和查詢。

  • 優點
  1. 深度語義理解:例如,如果你正在搜索“蘋果新產品發布”,這種模型可以識別出包含“iPhone最新版本上市”這樣非直接關鍵詞,但在語義上相關的文檔,因為"蘋果新產品發布"和"iPhone最新版本上市"具有相似的語義。
  2. 處理同義詞和多義詞:例如,“智能手機”、“移動電話”和“手提電話”可能在不同的文檔中表示同一概念。同樣,單詞“蘋果”可以是一種水果或是科技公司名。基于語義+關鍵字模型能夠理解這些差異。
  • 缺點
  1. 訓練資源需求大:需要大量數據,并且計算成本高昂,特別是對于深度學習模型,如BERT或GPT。
  2. 計算復雜性高:語義搜索需要計算與每個可用文檔的相似性,這可能在大型數據庫中導致延時。

基于詞袋模型的召回

基于詞袋模型的搜索是一種常見的關鍵字搜索方法,其中文檔和查詢被表示為單詞的集合或多集,忽略了任何語義和語法結構。

  • 優點
  1. 實現簡單:例如,如果你在搜索“蘋果新產品發布”,基于詞袋模型的搜索引擎將很容易找到包含這些確切短語的文檔。
  2. 計算效率高:只需檢查每個文檔是否包含查詢中的單詞,對于大規模數據也能妥善處理。
  • 缺點
  1. 不能理解語義:例如,“蘋果新產品發布”和“iPhone最新版本上市”在詞袋模型下可能被認為是不相關的,因為他們沒有公共的單詞,盡管他們在語義上密切相關。
  2. 無法處理同義詞和多義詞:比如“智能手機”和“移動電話”在詞袋模型看來是兩個完全不同的概念。同時"蘋果"這個詞的多重含義也無法區分。

選擇哪種模型取決于具體情況。如果查詢主要基于精確的關鍵字匹配,詞袋模型可能更適合;而如果語義理解更重要,則應該考慮使用基于語義+關鍵字的模型。在實踐中,這兩種方法往往結合在一起使用,例如,先使用詞袋模型進行粗略搜索,然后使用基于語義+關鍵字模型進行精確搜索。

?

本文轉載自公眾號AI 博物院 作者:longyunfeigu

原文鏈接:??https://mp.weixin.qq.com/s/kiZ9pcJ7xac4sesoJkiSYA??


?著作權歸作者所有,如需轉載,請注明出處,否則將追究法律責任
收藏
回復
舉報
回復
相關推薦
日韩一区二区在线播放| 青青草原av在线播放| 欧美激情 国产精品| 91福利区在线观看| 亚洲天堂久久久久久久| 一本一道久久a久久精品综合| 亚洲一区日本| 成人av蜜桃| 欧美日韩福利| 欧美精品xxx| 成人免费看黄网址| 国内精品亚洲| 性色av香蕉一区二区| 欧美极品影院| 成人午夜电影久久影院| 国产免费久久av| 亚洲黄页一区| 免费在线看黄色片| 99国产精品99久久久久久粉嫩| 欧美精品v日韩精品v韩国精品v| 少妇激情av一区二区| 欧美区视频在线观看| 成人黄色一区二区| 国产精品天天摸av网| 五丁香在线视频| 欧美激情资源网| 亚洲视频欧美在线| 国产一区二区三区av电影| 视色,视色影院,视色影库,视色网| 日本一区二区在线看| 日韩久久精品电影| a免费在线观看| 国产精品美女黄网| 国产精品色噜噜| 黄色直播在线| 欧美探花视频资源| 国产亚洲成av人片在线观黄桃| 欧美xxxx综合视频| 国产精品高潮久久| 久久五月天色综合| 欧美精品乱码| 久久av中文字幕| 日本韩国欧美| 亚洲电影在线观看| 99精品视频在线免费播放| 欧美在线观看视频| 亚洲黄色大片| 91超碰在线电影| 欧美国产三区| 久久国产精品99久久久久久丝袜| 精品国产乱码久久久久久虫虫漫画 | 亚洲成人三级在线| 成人夜色视频网站在线观看| 日韩精品在线第一页| 佐山爱痴汉视频一区二区三区| 国产偷国产偷精品高清尤物 | 国产又黄又猛又粗又爽的视频| 国产一区二区三区黄视频| 久久av免费一区| 亚洲激情五月| 国产精品日韩电影| 激情中国色综合| 国产丝袜一区二区三区| 国产99re66在线视频| 91精品一区二区三区久久久久久 | 欧美高潮视频| 一区二区三区蜜桃| 91色国产在线| 中文字幕欧美日本乱码一线二线| 日韩人妻精品无码一区二区三区| 91首页免费视频| 成人在线观看a| 99久久精品国产麻豆演员表| 日日橹狠狠爱欧美超碰| 久久你懂得1024| 欧美第一页浮力影院| 国产精品第13页| 免费观看成人网| 国产欧美日韩综合精品一区二区| 亚洲 中文字幕 日韩 无码| 国产午夜亚洲精品羞羞网站| 成人动漫h在线观看| 亚洲第一福利视频在线| av在线资源网| 亚洲社区在线观看| 中国av一区| 国产亚洲一区在线播放| 青青草国产成人99久久| 日韩在线第三页| 欧美日韩精品在线| 欧美xxxx黑人又粗又长| 亚洲视屏在线播放| 欧美综合自拍| 亚洲精品免费在线视频| 免播放器亚洲一区| 无码播放一区二区三区| 亚洲欧美经典视频| 91亚洲精选| 亚洲跨种族黑人xxx| 麻豆一区二区麻豆免费观看| 狠狠色综合网站久久久久久久| 99久久亚洲一区二区三区青草| 一本大道香蕉久在线播放29 | 久久久久久久久久久99999| 日本啊v在线| 久久亚洲一区二区三区四区五区高 | 日韩电影免费在线看| 牛夜精品久久久久久久| 91精品久久久久久久久99蜜臂| 视频一区视频二区欧美| 日本婷婷久久久久久久久一区二区| 国产精品毛片大码女人| yellow在线观看网址| 国产精品久久久久久av下载红粉| 国产激情视频一区二区三区欧美| 青青草观看免费视频在线| 欧美大片在线看| 韩国成人在线视频| 国产女主播在线直播| 久久久久久久国产精品| 青青草精品视频| 1769视频在线播放免费观看| 国产69精品久久久久久| 狠狠色丁香久久婷婷综合丁香| 成人在线观看黄色| 国产精品成人免费视频| 久久久国产综合精品女国产盗摄| 丁香花在线观看完整版电影| 91传媒视频在线观看| 国产精品久久久久久一区二区三区| 国产一二在线播放| 欧美性天天影院| 日本高清不卡在线观看| 美日韩中文字幕| 日韩av片网站| 久久精品最新地址| 精品在线视频一区| 国产在线xxx| 任我爽在线视频精品一| 在线免费一区三区| 亚洲a在线视频| 加勒比一区二区三区| 久久久久久久电影一区| 91在线你懂得| 第84页国产精品| 亚洲国产另类久久久精品极度| 欧美日韩国产精品自在自线| 9191国语精品高清在线| 美女黄视频在线播放| 国产精品99久久久久久久久久久久| 久久综合精品国产一区二区三区| av中文在线资源库| 亚洲最大免费| 精品视频中文字幕| 国产精品亚洲视频| 日韩成人亚洲| 久在线观看视频| 欧美成人高清视频| 亚洲国产精品高清| 久久久久97| 国产无遮挡在线视频免费观看| 国产精品久久久久久久电影| 亚洲午夜久久久久久久久电影网 | www.亚洲一区| 成人av网址在线观看| 日韩经典一区| 自慰无码一区二区三区| 久久综合免费视频影院| 久久综合久久综合久久| 亚洲综合网狠久久| 国产毛片毛片| 成人在线播放av| 欧美性大战久久久| 免费在线观看成人av| 鲁鲁在线中文| 久久这里只有精品8| 亚洲人成伊人成综合网久久久| 国产福利91精品一区二区三区| 57pao成人永久免费| 亚洲欧美国产中文| 国产成人在线一区| 色婷婷亚洲精品| 蜜臀久久99精品久久久久久9 | 亚洲国产sm捆绑调教视频| 亚洲动漫在线观看| 一级二级在线观看| 日本成人黄色免费看| 精品一区二区亚洲| 不卡的电视剧免费网站有什么| www国产精品| 天堂在线中文字幕| 日韩欧美亚洲精品| 这里只有精品丝袜| 亚洲蜜桃精久久久久久久| 一本一本久久a久久综合精品| 国内外激情在线| 波多野结衣家庭教师在线| 国产精品极品美女粉嫩高清在线| 7878成人国产在线观看| xfplay精品久久|