共現詞矩陣
- 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”]
-
矩陣片段:
I like NLP enjoy I 0 2 0 1 like 2 0 1 0
(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
- 關系 - 詞語: 4次
- 共現 - 蘋果: 4次
- 人工智能 - 自然語言: 2次
- 自然語言 - 領域: 2次
- 人工智能 - 領域: 2次
demo_co_occurrence_pairs.csv
demo_co_occurrence_matrix
demo_共現網絡圖.jpg
結語
共現詞矩陣是NLP領域的基礎工具,盡管矩陣維度隨詞匯量增長面臨稀疏性和高維度的挑戰,但通過優化算法(如SVD)和工程策略(分布式計算),其仍是語義分析和文本挖掘的重要支柱。實際應用中可結合具體任務選擇窗口大小和降維方法,以平衡性能與效果。