自然語言處理(9)—— 共現詞矩陣及Python實現

共現詞矩陣

    • 1. 概述
    • 2. 構建步驟
    • 3. 代碼實現(Python)
    • 結語

共現詞矩陣Co-occurrence Matrix)是自然語言處理(NLP)中用于捕捉詞語間語義關系的重要工具。共現矩陣通過統計詞語在特定上下文窗口內的共現頻率,揭示文本中詞匯的關聯性,并為關鍵詞提取、詞向量表示等任務提供支持。


1. 概述

(1)基本概念

共現詞矩陣Co-Occurrence Matrix) 是具有固定上下文窗口的共現矩陣 (Co-Occurrence Matrix with a fixed context window)。

共現詞矩陣通過統計語料庫中詞語對的共現次數構建。其核心思想是:語義相近的詞語往往在相似的上下文中出現。例如,在句子“蘋果是水果”和“芒果是水果”中,“蘋果”與“芒果”因共享上下文“水果”而具有語義關聯。

應用于以下場景

  • 關鍵詞提取:通過共現網絡識別高頻關聯詞,輔助主題分析。
  • 詞向量表示:將矩陣行/列作為詞向量,用于語義相似度計算。
  • 文本分類:結合共現特征增強模型對上下文的理解能力。

(2)上下文窗口

對于給定的語料庫,一對單詞(如 w 1 w_1 w1? w 2 w_2 w2?)的共現是指它們在上下文窗口(Context Window)中同時出現的次數。

因此,共現頻率的計算依賴于上下文窗口(Context Window),窗口大小決定統計范圍。例如,窗口大小為1時,僅統計相鄰詞對的共現次數;窗口大小為2時,覆蓋左右各兩個詞的位置。

(3)矩陣形式

共現矩陣的行和列為所有不重復詞語,矩陣元素表示對應詞語對的共現次數。例如,以下語料的共現矩陣(窗口大小=1):

  • 語料:[“I like NLP”, “I enjoy flying”]

  • 矩陣片段:

    IlikeNLPenjoy
    I0201
    like2010

(4)優缺點

優點缺點
保留詞語語義關系(如近義詞聚類)高內存消耗(需存儲N×N矩陣)
無需復雜訓練,一次構建可重復使用稀疏性導致計算效率低

2. 構建步驟

(1)數據預處理

  • 分詞與去重:將文本拆分為詞語列表,并提取唯一關鍵詞集合。
  • 格式化語料:將每篇文章或句子轉換為詞語序列。

(2)矩陣初始化
構建一個大小為N×N的空矩陣(N為關鍵詞數量),首行和首列填入關鍵詞列表。

(3)共現頻率計算

  • 字典優化法:記錄每個關鍵詞在語料中的位置(如行號),通過集合交集快速計算共現次數。
  • 窗口遍歷法:對每個詞語,遍歷其窗口范圍內的鄰近詞,逐對累加共現計數。

e.g.1
在這里插入圖片描述
輸出如下:
在這里插入圖片描述
e.g.2
在這里插入圖片描述
輸出如下:
在這里插入圖片描述
紅框表示“He”和“is”在上下文窗口等于2時的共現次數是4。為了理解和可視化計數,具體共現情況如下圖:

在這里插入圖片描述


3. 代碼實現(Python)

讀取文件

######################## 讀取文件 ########################
def readFile(filePath): # #讀取停止詞 輸入: 文件路徑  輸出:字符串with open(filePath,encoding = 'utf-8') as file:mytext = file.read() #返回一個字符串return mytext

文件處理

######################## 文件處理 ########################
def process_text(text_cn, stopWord_cn, defstop=None):words = jieba.lcut(text_cn)words = [w for w in words if ((w not in stopWord_cn)&('\u4e00' <= w <= '\u9fff'))]return words

構建共現矩陣字典

######################## 構建共現矩陣字典 ########################
def build_cooccurrence_matrix(words, window_size=2):"""    :param text: 輸入文本(字符串):param window_size: 上下文窗口半徑:return: 共現統計字典""" co_occur = defaultdict(int) # 共現統計字典# 遍歷每個中心詞for center_idx in range(len(words)):center_word = words[center_idx]     # 確定上下文窗口邊界left = max(0, center_idx - window_size)right = min(len(words), center_idx + window_size + 1)      # 遍歷窗口內其他詞for other_idx in range(left, right):if other_idx == center_idx:continue  # 跳過自身          other_word = words[other_idx]           # 創建有序詞對(避免A-B和B-A重復計數)sorted_pair = tuple(sorted([center_word, other_word]))          # 更新共現次數co_occur[sorted_pair] += 1   # 返回共現統計字典return co_occur

TopN共現詞

######################## TopN共現詞 ########################
def get_top_vocab(co_dict, N=10):sorted_pairs = sorted(co_dict.items(), key=lambda x: x[1], reverse=True)top_pairs = [(pair, count) for pair, count in sorted_pairs if pair[0] != pair[1]][:N]print("共現詞對Top"+str(N))for idx, (pair, count) in enumerate(top_pairs, 1):print(f"{idx}. {pair[0]} - {pair[1]}: {count}次")all_words = []for pair, count in top_pairs:all_words.extend(pair)top_vocab = set(all_words)return top_vocab,sorted_pairs

保存結果

######################## 保存結果 ########################
def save_results(co_dict,sorted_pairs,top_vocab,output_prefix):"""保存兩個CSV文件:共現詞對和矩陣"""# 保存TopN共現詞對  df_pairs = pd.DataFrame([(p[0], p[1], c) for (p, c) in sorted_pairs if p[0] in top_vocab and p[1] in top_vocab],columns=["Word1", "Word2", "Count"])df_pairs.to_csv(f"{output_prefix}_pairs.csv", index=False)# 構建并保存共現矩陣matrix = pd.DataFrame(0, index=top_vocab, columns=top_vocab)for (w1, w2), count in co_dict.items():if w1 in top_vocab and w2 in top_vocab:matrix.at[w1, w2] += countmatrix.at[w2, w1] += count  # 對稱矩陣matrix.to_csv(f"{output_prefix}_matrix.csv")return df_pairs, matrix

示例

sample_text = """自然語言處理是人工智能領域的重要方向。通過分析文本中的詞語共現關系,我們可以發現詞語之間的語義關聯。例如“蘋果”與“手機”的共現可能暗示科技主題,而“蘋果”與“水果”的共現則指向食品領域。深度學習模型常利用共現矩陣捕捉語義信息。"""
# 參數配置
params = {"window_size": 2,"top_N": 5,"output_prefix": "demo_co_occurrence"}
stopWordfile_cn = r'Data/stopword_cn.txt'# 0. 讀取文件
stopWord_cn = readFile(stopWordfile_cn) ##讀取中文停止詞  
# 1. 文本預處理
words = process_text(sample_text, stopWord_cn)
# 2. 構建共現詞典
co_occur = build_cooccurrence_matrix(words, params["window_size"])
# 3. TopN共現詞
top_vocab,sorted_pairs = get_top_vocab(co_occur, params["top_N"])
# 4. 保存結果
df_pairs, df_matrix = save_results(co_occur,sorted_pairs,top_vocab, params["output_prefix"])print("共現詞對已保存至 demo_co_occurrence_pairs.csv")
print("共現矩陣已保存至 demo_co_occurrence_matrix.csv")plt.rcParams['font.sans-serif'] = ['Arial Unicode MS'] 
plt.figure(figsize=(10, 10))
graph1 = nx.from_pandas_adjacency(df_matrix)
nx.draw(graph1, with_labels=True, node_color='red', font_size=25, edge_color='blue')
plt.savefig('demo_共現網絡圖.jpg')

輸出:
共現詞對Top5

  1. 關系 - 詞語: 4次
  2. 共現 - 蘋果: 4次
  3. 人工智能 - 自然語言: 2次
  4. 自然語言 - 領域: 2次
  5. 人工智能 - 領域: 2次

demo_co_occurrence_pairs.csv

在這里插入圖片描述
demo_co_occurrence_matrix

在這里插入圖片描述
demo_共現網絡圖.jpg
在這里插入圖片描述
在這里插入圖片描述


結語

共現詞矩陣是NLP領域的基礎工具,盡管矩陣維度隨詞匯量增長面臨稀疏性高維度的挑戰,但通過優化算法(如SVD)和工程策略(分布式計算),其仍是語義分析和文本挖掘的重要支柱。實際應用中可結合具體任務選擇窗口大小和降維方法,以平衡性能與效果。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/77088.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77088.shtml
英文地址,請注明出處:http://en.pswp.cn/web/77088.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spark SQL核心解析:大數據時代的結構化處理利器

在大數據處理領域&#xff0c;Spark以其強大的分布式計算能力脫穎而出&#xff0c;而Spark SQL作為Spark生態系統的重要組成部分&#xff0c;為結構化和半結構化數據處理提供了高效便捷的解決方案。它不僅整合了傳統SQL的強大查詢功能&#xff0c;還深度集成到Spark的計算框架中…

多態以及多態底層的實現原理

本章目標 1.多態的概念 2.多態的定義實現 3.虛函數 4.多態的原理 1.多態的概念 多態作為面對三大特性之一,它所指代的和它的名字一樣,多種形態.但是這個多種形態更多的指代是函數的多種形態. 多態分為靜態多態和動態多態. 靜態多態在前面已經學習過了,就是函數重載以及模板,…

linux下開發NFC讀寫器

linux下使用NFC讀卡器&#xff0c;基于QT5開發 創建工程&#xff0c;引入lib開始編寫代碼 創建工程&#xff0c;引入lib 創建一個QT工程&#xff0c;如果是控制臺程序&#xff0c;則去掉gui QT - gui引入lib庫 LIBS -L$$PWD/lib -lyw60x這里需要將libyw60x.so庫文件放在工程…

Linux基礎使用-筆記

1. 文件和目錄操作 查看當前目錄&#xff1a;pwd 命令用于顯示當前工作目錄的完整路徑。 pwd切換目錄&#xff1a;cd 命令用于切換工作目錄。 # 切換到指定目錄 cd /home/user/Documents # 切換到上一級目錄 cd .. # 切換到用戶主目錄 cd ~列出目錄內容&#xff1a;ls 命令用…

DAG(有向無環圖)計算模型面試內容整理-拓撲排序(Topological Sort)和節點依賴與并行度

拓撲排序(Topological Sort) 拓撲排序(Topological Sort): 拓撲排序是針對有向無環圖(DAG)的一種線性排序方法。這種排序方法的特點是,對于DAG中的每一條有向邊 (A → B),在拓撲排序中節點A總是排在節點B之前。

23種設計模式-結構型模式之享元模式(Java版本)

Java 享元模式&#xff08;Flyweight Pattern&#xff09;詳解 &#x1f98b; 什么是享元模式&#xff1f; 享元模式是一種結構型模式&#xff0c;它通過共享相同的對象來減少內存消耗&#xff0c;適用于大量細粒度對象的場景。關鍵思想是緩存重復出現的對象&#xff0c;避免…

瀏覽器訪問背后的秘密:從加載到關閉,數據是否會丟失?

? 一次瀏覽器訪問 www.xxx.com 背后發生了什么&#xff1f; —— 以及“我點了 &#xff0c;數據會不會丟&#xff1f;”的深度剖析 適讀人群&#xff1a;Web 開發者、運維工程師、性能調優/安全從業者 1?? 打開瀏覽器敲下網址&#xff1a;鏈路是如何啟動的&#xff1f; 階…

【HDFS入門】深入解析DistCp:Hadoop分布式拷貝工具的原理與實踐

目錄 1 DistCp概述與應用場景 2 DistCp架構設計解析 2.1 系統架構圖 2.2 執行流程圖 3 DistCp核心技術原理 3.1 并行拷貝機制 3.2 斷點續傳實現原理 4 DistCp實戰指南 4.1 常用命令示例 4.2 性能優化策略 5 異常處理與監控 5.1 常見錯誤處理流程 5.2 監控指標建議…

hbuilderx云打包生成的ipa文件如何上架

使用hbuilderx打包&#xff0c;會遇到一個問題。開發的ios應用&#xff0c;需要上架到app store&#xff0c;因此&#xff0c;就需要APP store的簽名證書&#xff0c;并且還需要一個像xcode那樣的工具來上架app store。 我們這篇文章說明下&#xff0c;如何在windows電腦&…

第十五屆藍橋杯 2024 C/C++組 拼正方形

目錄 題目&#xff1a; 題目描述&#xff1a; 題目鏈接&#xff1a; 思路&#xff1a; 思路詳解&#xff1a; 易錯點&#xff1a; 代碼&#xff1a; 代碼詳解&#xff1a; 題目&#xff1a; 題目描述&#xff1a; 題目鏈接&#xff1a; P10898 [藍橋杯 2024 省 C] 拼正…

華為云獲取IAM用戶Token的方式及適用分析

&#x1f9e0; 一、為什么要獲取 IAM 用戶 Token&#xff1f; 我們用一個生活中的比喻來解釋&#x1f447;&#xff1a; &#x1f3e2; 比喻場景&#xff1a; 你要去一個 高級寫字樓&#xff08;華為云物聯網平臺&#xff09; 辦事&#xff08;調用接口管理設備&#xff09;&…

樂聚機器人與地瓜機器人達成戰略合作,聯合發布Aelos Embodied具身智能

要聞 4月19日&#xff0c;在CCF人形機器人與人工智能技術巡回研討會&#xff08;武漢站&#xff09;上&#xff0c;樂聚機器人與地瓜機器人達成戰略合作&#xff0c;雙方將基于RDK X5、RDK S100以及更高性能的國產大算力平臺&#xff0c;就夸父&#xff08;KUAVO&#xff09;、…

Web3架構下的數據隱私與保護

在這個信息爆炸的時代&#xff0c;Web3的概念如同一股清流&#xff0c;以其去中心化的特性&#xff0c;為數據隱私與保護帶來了新的希望。Web3&#xff0c;也被稱作下一代互聯網&#xff0c;它通過區塊鏈技術實現數據的去中心化存儲和處理&#xff0c;旨在提高數據的安全性和隱…

【OceanBase相關】02-OceanBase數據庫NFS備份實踐

文章目錄 一、前言1、概述2、備份方式3、備份流程4、恢復流程二、NFS備份1、注意事項2、服務端配置3、客戶端配置4、備份策略配置三、常用操作四、Q&A1、數據備份任務執行失敗,提示`start log archive backup when not STOP is not supported`1.1、問題說明1.2、解決措施2…

一行命令打開iOS模擬器

要在 Mac 命令行打開 iPhone 15 Pro 模擬器&#xff0c;需滿足已安裝 Xcode 這一前提條件&#xff0c;以下是具體操作步驟&#xff1a; 步驟一&#xff1a;列出所有可用模擬器設備 打開終端&#xff08;Terminal&#xff09;&#xff0c;輸入并執行以下命令&#xff0c;用于列…

Java虛擬機(JVM)家族發展史及版本對比

Java虛擬機&#xff08;JVM&#xff09;家族發展史及版本對比 一、JVM家族發展史 1. 早期階段&#xff08;1996-2000&#xff09; Classic VM&#xff08;Java 1.0-1.1&#xff09;&#xff1a; 廠商&#xff1a;Sun Microsystems&#xff08;Oracle前身&#xff09;。特點&…

嘻游電玩三端客戶端部署實戰:PC + Android + iOS 環境全覆蓋教程

本篇文章將針對“網狐系列嘻游電玩組件”的三端客戶端&#xff08;PC端、安卓端、iOS端&#xff09;進行詳細部署實操講解。文章將以實測部署為核心&#xff0c;提供資源結構說明、平臺適配調整、打包配置、常見問題修復&#xff0c;并輔以必要的關鍵配置代碼。 一、客戶端資源…

LabVIEW實現Voronoi圖繪制功能

該 LabVIEW 虛擬儀器&#xff08;VI&#xff09;借助 MathScript 節點&#xff0c;實現基于手機信號塔位置計算 Voronoi 圖的功能。通過操作演示&#xff0c;能直觀展示 Voronoi 圖在空間劃分上的應用。 各部分功能詳細說明 隨機地形創建部分 功能&#xff1a;根據 “Maximum a…

web刷題筆記

2024isctf ezrce 禁用了一些關鍵字符&#xff0c;查詢函數&#xff0c;系統執行函數&#xff0c;執行函數都有&#xff0c;空格也和斜桿也禁用了&#xff0c;但是其他一些很大一部分字符都沒有禁用&#xff0c;屬于關鍵詞禁用的類型&#xff0c;正常的步驟是去查一下列表&#…

集結號海螺捕魚游戲源碼解析(第二篇):水滸傳捕魚模塊邏輯與服務器幀同步詳解

本篇將全面解構“水滸傳”子游戲的服務端核心邏輯、幀同步機制、魚群刷新規則、客戶端命中表現與服務器計算之間的協同方式&#xff0c;聚焦于 C 與 Unity3D 跨端同步的真實實現過程。 一、水滸傳捕魚模塊資源結構 該模塊包含三部分核心目錄&#xff1a; 子游戲/game_shuihuz…