通过共现矩阵和余弦相似度实现机器对单词的认知、python实现
通過共現矩陣和余弦相似度實現機器對單詞的認知、python實現
- 本文介紹的定義:
- 一、語料庫預處理
- 二、單詞的分布式表示
- 三、單詞的相似度
- 四、相似單詞排序
本文介紹的定義:
語料庫、計數方法的目的、語料庫預處理、單詞的分布式表示、分布式假設、上下文、窗口大小、基于計數的方法表示單詞、用向量表示單詞、共現矩陣、單詞的相似度、余弦相似度、相似單詞排序。
一、語料庫預處理
語料庫:大量的文本數據。
計數方法的目的:從語料庫中提取語言的本質。
語料庫預處理:將文本分割為單詞,并將分割后的單詞列表轉化為單詞ID列表。實現代碼如下,其中corpus 是單詞ID列表,word_to_id 是單詞到單詞ID的字典,id_to_word是單詞ID到單詞的字典。
def preprocess(text):text = text.lower()text = text.replace('.', ' .')words = text.split(' ')word_to_id = {}id_to_word = {}for word in words:if word not in word_to_id:new_id = len(word_to_id)word_to_id[word] = new_idid_to_word[new_id] = wordcorpus = np.array([word_to_id[w] for w in words])return corpus, word_to_id, id_to_word舉個例子:
text = 'You say goodbye and I say hello.' corpus, word_to_id, id_to_word = preprocess(text) print(corpus) print(word_to_id) print(id_to_word)輸出:
[0 1 2 3 4 1 5 6] {'you': 0, 'say': 1, 'goodbye': 2, 'and': 3, 'i': 4, 'hello': 5, '.': 6} {0: 'you', 1: 'say', 2: 'goodbye', 3: 'and', 4: 'i', 5: 'hello', 6: '.'}二、單詞的分布式表示
單詞的分布式表示:顏色通過RGB三原色分別存在多少來表示,RGB這樣的向量表示,可以更準確地指定顏色,顏色之間的關聯性(是否是相似的顏色)也更容易通過向量表示來判斷和量化。類似于顏色的向量表示方法運用到單詞上,形成單詞含義的向量表示,在自然語言處理領域,這稱為分布式表示。
分布式假設:某個單詞的含義由它周圍的單詞形成。單詞本身沒有含義,單詞含義由它所在的上下文(語境)形成。
上下文:上下文是指某個單詞的周圍詞匯。
窗口大小:將上下文的大小(即周圍的單詞有多少個)稱為窗口大小。
基于計數的方法表示單詞:如何基于分布式假設使用向量表示單詞?可以在關注某個單詞的情況下,對它的周圍出現了多少次什么單詞進行計數,然后再匯總,稱為“基于計數的方法”。
用向量表示單詞:向量表示的是每個單詞的上下文(與窗口大小有關)所包含的單詞的頻數(出現次數)。
共現矩陣:如下圖所示,匯總所有單詞的向量表示的表格。
代碼:
def create_co_matrix(corpus, vocab_size, window_size=1):'''生成共現矩陣:param corpus: 語料庫(單詞ID列表):param vocab_size:詞匯個數:param window_size:窗口大小(當窗口大小為1時,左右各1個單詞為上下文):return: 共現矩陣'''corpus_size = len(corpus)co_matrix = np.zeros((vocab_size, vocab_size), dtype=np.int32)for idx, word_id in enumerate(corpus):for i in range(1, window_size + 1):left_idx = idx - iright_idx = idx + iif left_idx >= 0:left_word_id = corpus[left_idx]co_matrix[word_id, left_word_id] += 1if right_idx < corpus_size:right_word_id = corpus[right_idx]co_matrix[word_id, right_word_id] += 1return co_matrix C = create_co_matrix(corpus, vocab_size, window_size=1) for i in range(7):print(C[i])輸出:
[0 1 0 0 0 0 0] [1 0 1 0 1 1 0] [0 1 0 1 0 0 0] [0 0 1 0 1 0 0] [0 1 0 1 0 0 0] [0 1 0 0 0 0 1] [0 0 0 0 0 1 0]三、單詞的相似度
單詞的相似度:兩個單詞含義相近的程度。
前面通過共現矩陣將單詞表示為了向量,如何測量向量間的相似度?有代表性的方法有向量內積、歐式距離、余弦相似度等。
余弦相似度:設有x、y兩個向量,他們的余弦相似度公式如下。余弦相似度直觀表示了兩個向量在多大程度上指向同一方向,兩個向量完全指向相同的方向時,余弦相似度為 1;完全指向相反的方向時,余弦相似度為 -1。
實現余弦相似度:需要解決除數為0問題,可以在執行除法時加上一個微小值。
實現代碼:
def cos_similarity(x, y, eps=1e-8):'''計算余弦相似度:param x: 向量:param y: 向量:param eps: 用于防止“除數為0”的微小值:return:'''nx = x / (np.sqrt(np.sum(x ** 2)) + eps)ny = y / (np.sqrt(np.sum(y ** 2)) + eps)return np.dot(nx, ny)例子:求you和i的相似度 。
text = 'You say goodbye and I say hello.' corpus, word_to_id, id_to_word = preprocess(text) vocab_size = len(word_to_id) C = create_co_matrix(corpus, vocab_size)c0 = C[word_to_id['you']] #you的單詞向量 c1 = C[word_to_id['i']] #i的單詞向量 print(cos_similarity(c0, c1))輸出:
0.7071067691154799四、相似單詞排序
相似單詞排序:當某個單詞被作為查詢詞時,將與這個查詢詞相似的單詞按降序顯示出來。
實現步驟:
1.取出查詢詞的單詞向量:
query_id = word_to_id[query] query_vec = word_matrix[query_id]2.求查詢詞的單詞向量和其他所有單詞向量的余弦相似度。
vocab_size = len(id_to_word) similarity = np.zeros(vocab_size) for i in range(vocab_size):similarity[i] = cos_similarity(word_matrix[i], query_vec)3.基于余弦相似度的結果,按降序顯示它們的值。argsort()方法可以按升序對 NumPy 數組的元素進行排序,返回值是數組的索引。將 NumPy 數組的各個元素乘以 -1 后,再使用 argsort() 方法,可以按降序輸出單詞相似度。
count = 0for i in (-1 * similarity).argsort():if id_to_word[i] == query:continueprint(' %s: %s' % (id_to_word[i], similarity[i]))count += 1if count >= top:return完整代碼:
def most_similar(query, word_to_id, id_to_word, word_matrix, top=5):'''相似單詞的查找:param query: 查詢詞:param word_to_id: 從單詞到單詞ID的字典:param id_to_word: 從單詞ID到單詞的字典:param word_matrix: 匯總了單詞向量的矩陣,假定保存了與各行對應的單詞向量:param top: 顯示到前幾位'''if query not in word_to_id:print('%s is not found' % query)returnprint('\n[query] ' + query)query_id = word_to_id[query]query_vec = word_matrix[query_id]vocab_size = len(id_to_word)similarity = np.zeros(vocab_size)for i in range(vocab_size):similarity[i] = cos_similarity(word_matrix[i], query_vec)count = 0for i in (-1 * similarity).argsort():if id_to_word[i] == query:continueprint(' %s: %s' % (id_to_word[i], similarity[i]))count += 1if count >= top:return例子:按降序顯示與you最相似的前五個單詞。
text = 'You say goodbye and I say hello.' corpus, word_to_id, id_to_word = preprocess(text) vocab_size = len(word_to_id) C = create_co_matrix(corpus, vocab_size)most_similar('you', word_to_id, id_to_word, C, top=5)輸出:結果和我們的感覺存在很大的差異。一個可能的原因是,這里的語料庫太小了。
[query] yougoodbye: 0.7071067691154799i: 0.7071067691154799hello: 0.7071067691154799say: 0.0and: 0.0總結
以上是生活随笔為你收集整理的通过共现矩阵和余弦相似度实现机器对单词的认知、python实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php tar.gz文件,PHP解压ta
- 下一篇: python 列表、元组、集合、字典、循