自然语言处理(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.mzph.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…