文本相似度、文本匹配、文本聚类
生活随笔
收集整理的這篇文章主要介紹了
文本相似度、文本匹配、文本聚类
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1 1在Keras的Embedding層中使用預(yù)訓(xùn)練的word2vec詞向量:https://blog.csdn.net/u012052268/article/details/90238282
import numpy as np import pandas as pd#1準(zhǔn)備工作# graph LR # 文本-->分詞 # 分詞-->訓(xùn)練詞向量 # 訓(xùn)練詞向量-->保存詞向量import gensim #訓(xùn)練自己的詞向量,并保存def trainWord2Vec(filePath):sentences = gensim.models.word2vec.LineSentence(filePath)#讀取分詞后的文本model = gensim.models.Word2Vec(sentences, size=100, window=5, min_count=1, workers=4)#訓(xùn)練模型model.save('./CarComment_vord2vec_100')def testMyWord2Vec():#讀取自己的詞向量,并簡(jiǎn)單測(cè)試一下效果inp = './CarCommennt_vord2vec_100' #讀取詞向量model = gensim.models.Word2Vec.load(inp)print('空間的詞向量(100維):', model['空間'])print('打印與空間最相近的5個(gè)詞語(yǔ):', model.most_similar('空間', topn=5))if __name__ == '__main__':testMyWord2Vec()pass#通過上述,我們就擁有了預(yù)訓(xùn)練的詞向量文件CarCommennt_vord2vec_100# 轉(zhuǎn)化詞向量為keras所需格式 #keras中使用的embedding層,embedding層所需要的格式為一個(gè)巨大的“矩陣”:第i列表示詞索引為i的詞的詞向量 #思路:embedding層,提供一個(gè)【word:word_vector]的詞典來初始化embedding層中所需要的的大矩陣,并且標(biāo)記為不可訓(xùn)練# 獲取所有詞語(yǔ)word和詞向量 #首先導(dǎo)入預(yù)訓(xùn)練的詞向量 myPath = './CarCommennt_vord2vec_100' #本地詞向量的位置 Word2VecModel = gensim.models.Word2Vec.load(myPath) # 讀取詞向量 vector = Word2VecModel.wv['空間'] #詞語(yǔ)的向量,是numpy格式#gensim的word2vec模型 把所有的單詞和 詞向量 都存儲(chǔ)在了Word2VecModel.wv里面,講道理直接使用這個(gè).wv即可print(type(Word2VecModel.wv)) #結(jié)果為Word2VecKeyedVectorsfor i,j in Word2VecModel.wv.vocab.items():print(i) #此時(shí)i 代表每個(gè)單詞print(j) #j代表封裝了詞頻等信息的gensim“Vocab”對(duì)象,例子:Vocab(count:1481, index:38, sample_int:3701260191)break#2.2 構(gòu)造“詞語(yǔ)——詞向量”字典#構(gòu)造一個(gè)list存儲(chǔ)所有的單詞:vocab——list存儲(chǔ)所有詞語(yǔ) #構(gòu)造一個(gè)字典word_index:{word:index}, key是每個(gè)詞語(yǔ),value是單詞在字典中的序號(hào)。 #在后期tokenize(序號(hào)化)訓(xùn)練集的時(shí)候就是用該詞典#構(gòu)造一個(gè)大向量矩陣embedding_matrix(按照embedding層的要求):行數(shù)為所有單詞數(shù),比如10000;列數(shù)為詞向量維度,比如100.#構(gòu)造包含所有詞語(yǔ)的list,以及初始化“詞語(yǔ)-序號(hào)”字典和“詞向量”矩陣vocab_list = [word for word, Vocab in Word2VecModel.wv.vocab.items()]#存儲(chǔ)所有的詞語(yǔ) word_index = {" ": 0}#初始化‘[word:token]',后期tokenize語(yǔ)料庫(kù)就是用該詞典 word_vector = {} #初始化’[word:vector]'字典#初始化存儲(chǔ)所有向量的大矩陣,留意其中多一位(首行),詞向量全為0,用于padding補(bǔ)零 #行數(shù)為所有單詞+1,比如10001;列數(shù)為詞向量維度,比如100embedding_matrix = np.zeros((len(vocab_list)+1),Word2VecModel.vector_size)#2.3 填充字典和矩陣 #填充上述步驟中的字典和大矩陣for i in range(len(vocab_list)):word = vocab_list[i] #每個(gè)詞語(yǔ)word_index[word] = i+1 #詞語(yǔ):序號(hào)word_vector[word] = Word2VecModel.wv[word]#詞語(yǔ):詞向量embedding_matrix[i+1] = Word2VecModel.wv[word] #詞向量矩陣#2.4在keras的embedding層中使用與馴良詞向量from keras.layers import Embeddingfrom keras.utils.np_utils import *#from…import *:是把一個(gè)模塊中所有函數(shù)都導(dǎo)入進(jìn)來; 注:相當(dāng)于:相當(dāng)于導(dǎo)入的是一個(gè)文件夾中所有文件,所有函數(shù)都是絕對(duì)路徑。 EMBEDDING_DIM = 100 #詞向量維度embedding_layer = Embedding(input_dim=len(embedding_matrix),#字典長(zhǎng)度EMBEDDING_DIM, #詞向量長(zhǎng)度100weights= [embedding_matrix],#重點(diǎn):預(yù)訓(xùn)練的詞向量系數(shù)input_length=MAX_SEQUENCE_LENGTH,#每句話的最大長(zhǎng)度(必須paddingtrainable=False) #是否在訓(xùn)練的過程中更新詞向量#此時(shí)輸入EMbedding層的數(shù)據(jù)的維度是,形如(samples,sequence_length)的2D張量 #3D張量:(samples,sequence_length,embeding_matrix)#*2.5不使用“預(yù)訓(xùn)練”而直接生成詞向量模型 #我們也可以直接使用KERAS自帶的Embedding層訓(xùn)練詞向量,而不用預(yù)訓(xùn)練的word2vec詞向量。 embedding_layer = Embedding(len(word_index)+1,#由于沒有預(yù)訓(xùn)練,設(shè)置 +1EMBEDDING_DIM,input_length = MAX_SEQUENCE_LENGTH)#一般來說,在自然語(yǔ)言處理任務(wù)中,當(dāng)樣本數(shù)量非常少時(shí),使用預(yù)訓(xùn)練的詞向量是可行的。(實(shí)際上,預(yù)訓(xùn)練的詞向量引入了外部語(yǔ)義信息# 3整體代碼:在Keras模型中使用預(yù)訓(xùn)練的詞向量 #文本數(shù)據(jù)預(yù)處理,將每個(gè)文本樣本轉(zhuǎn)換為一個(gè)數(shù)字矩陣,矩陣的每一行表示一個(gè)詞向量。# 3.1 讀取數(shù)據(jù) def load_file():dataFrame_2016 = pd.read_csv('data\\nlpcc2016_traindata_zong_right.csv', encoding='utf-8')print(dataFrame_2016.coloumns) #打印列的名稱texts = [] #存儲(chǔ)讀取的xlabels = [] #存儲(chǔ)讀取的y#遍歷獲取數(shù)據(jù)for i in range(len(dataFrame_2016)):texts.append(dataFrame_2016.iloc[i].q_text)##每個(gè)元素為一句話“《機(jī)械設(shè)計(jì)基礎(chǔ)》這本書的作者是誰?”labels.append(dataFrame_2016.iloc[i].q_type)#每個(gè)元素為一個(gè)int 代表類別 # [2, 6, ... 3] 的形式#把類別從int3轉(zhuǎn)換為(0,0,0,1,0,0)的形式labels = to_categorical(np.assarray(labels))## keras的處理方法,一定要學(xué)會(huì)# 此時(shí)為[[0. 0. 1. 0. 0. 0. 0.]....] 的形式return texts,labels#3.2句子分詞 import jieba #jieba.lcut生成為一個(gè)列表 def cut_sentence2word(texts):texts = [jieba.lcut(Sentence.repalce('\n','')) for Sentence in texts]#句子分詞return texts#構(gòu)造詞向量字典#獲取word2vec模型,并構(gòu)造,詞語(yǔ)index字典,詞向量字典 import os ## 3.獲取word2vec模型, 并構(gòu)造,詞語(yǔ)index字典,詞向量字典 def get_word2vec_dictionaries(texts):def get_word2vec_model(texts=None): # 獲取 預(yù)訓(xùn)練的詞向量 模型,如果沒有就重新訓(xùn)練一個(gè)。if os.path.exists('data_word2vec/Word2vec_model_embedding_25'): # 如果訓(xùn)練好了 就加載一下不用反復(fù)訓(xùn)練model = Word2Vec.load('data_word2vec/Word2vec_model_embedding_25')# print(model['作者'])return modelelse:model = Word2Vec(texts, size = EMBEDDING_DIM, window=7, min_count=10, workers=4)model.save('data_word2vec/Word2vec_model_embedding_25') # 保存模型return modelWord2VecModel = get_word2vec_model(texts) # 獲取 預(yù)訓(xùn)練的詞向量 模型,如果沒有就重新訓(xùn)練一個(gè)。vocab_list = [word for word, Vocab in Word2VecModel.wv.vocab.items()] # 存儲(chǔ) 所有的 詞語(yǔ)word_index = {" ": 0}# 初始化 `[word : token]` ,后期 tokenize 語(yǔ)料庫(kù)就是用該詞典。word_vector = {} # 初始化`[word : vector]`字典# 初始化存儲(chǔ)所有向量的大矩陣,留意其中多一位(首行),詞向量全為 0,用于 padding補(bǔ)零。# 行數(shù) 為 所有單詞數(shù)+1 比如 10000+1 ; 列數(shù)為 詞向量“維度”比如100。embeddings_matrix = np.zeros((len(vocab_list) + 1, Word2VecModel.vector_size))## 填充 上述 的字典 和 大矩陣for i in range(len(vocab_list)):word = vocab_list[i] # 每個(gè)詞語(yǔ)word_index[word] = i + 1 # 詞語(yǔ):序號(hào)word_vector[word] = Word2VecModel.wv[word] # 詞語(yǔ):詞向量embeddings_matrix[i + 1] = Word2VecModel.wv[word] # 詞向量矩陣return word_index, word_vector, embeddings_matrix #3.4文本序號(hào)化Tokenizer #英文文本不用切詞,因?yàn)槟J(rèn)會(huì)將空格將詞切開,就需要切詞,且每個(gè)詞用空格隔開 from keras.preprocessing.text import Tokenizer tokenizer = Tokenizer(num_words = 2000) #建一個(gè)2000個(gè)單詞的字典 tokenizer.fit_on_texts(train_texts)#當(dāng)然我們也可以使用之前構(gòu)建的word——index字典。手動(dòng)構(gòu)建tokenizer句子(推薦這種方法,這樣序號(hào)下標(biāo)與預(yù)訓(xùn)練詞向量一致。from keras.preprocessing import sequence #序號(hào)化文本,tokenizer句子,并返回每個(gè)句子所對(duì)應(yīng)的詞語(yǔ)索引 def tokenizer(texts,word_index):data = []for sentence in texts:new_txt = []for word in sentence:try:new_txt.append(word_index[word]) #把句子中的詞語(yǔ)轉(zhuǎn)化為indexexcept:new_txt.append(0)data.append(new_txt)texts = sequence#3.5 切分?jǐn)?shù)據(jù) from sklearn.model_selection import train_test_split def split_data(texts,labels):x_train, x_test, y_train, y_test = train_test_split(texts,labels,test_size=0.2)return x_train,x_test,y_train,y_testembedding_layer = Embedding(input_dim=len(embeddings_matrix), # 字典長(zhǎng)度output_dim = EMBEDDING_LEN, # 詞向量 長(zhǎng)度(25)weights=[embeddings_matrix], # 重點(diǎn):預(yù)訓(xùn)練的詞向量系數(shù)input_length=MAX_SEQUENCE_LENGTH, # 每句話的 最大長(zhǎng)度(必須padding) 10trainable=False, # 是否在 訓(xùn)練的過程中 更新詞向量name= 'embedding_layer')本文的部分工作、代碼、數(shù)據(jù)共享到gethub網(wǎng)站《使用多層級(jí)注意力機(jī)制和keras實(shí)現(xiàn)問題分類》:https://github.com/xqtbox/question-classification-with-multi-level-attention-mechanism-and-keras
2 QA match/文本匹配/文本分類/文本embedding/文本聚類/文本檢索:https://github.com/MachineLP/TextMatch
3 文本相似度計(jì)算/文本匹配
https://github.com/JepsonWong/Text_Matching
總結(jié)
以上是生活随笔為你收集整理的文本相似度、文本匹配、文本聚类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AINLP-Archive:AINLP文
- 下一篇: 图解gpt-2