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