使用SO-PMI算法构建行业/专业情感词典

article/2025/3/12 1:23:23

文章目录

  • 1. 情感词典内容
  • 2. 情感倾向点互信息算法(SO-PMI)算法
    • 点互信息算法 PMI
    • 情感倾向点互信息算法 SO-PMI
  • 3. 构建情感词典
    • 1. 导入项目
    • 2. 构建情感种子词
    • 3. 使用TF-IDF方便构建情感种子词
    • 4. 构建专业词典的效果与使用方法
    • 5. 其他说明

1. 情感词典内容

  1. 情感词典构建方法归为三类, 分别是: 词关系扩展法、迭代路径法和释义扩展法
  2. 情感极性:正向、负向;表示正面情感(开心愉快)或负面情感(伤心愤怒)
  3. 情感极值:情感倾向(微笑、开怀大笑、手舞足蹈虽然都可以表示开心,但有不一样的极值,表示情绪的表现程度)

已有的情感词典请参考:
在这里插入图片描述

2. 情感倾向点互信息算法(SO-PMI)算法

这个算法比较直白:包含两个部分,一个是PMI,一个是SO-PMI

点互信息算法 PMI

在这里插入图片描述
w o r d 1 word1 word1 w o r d 2 word2 word2 表示两个不同的词, P w o r d 1 P_{word1} Pword1 表示在整个语料库中 w o r d 1 word1 word1 出现的概率,一般认为:

1. PMI > 0 表示两个词语是相关的,值越大,相关性越强
2. PMI = 0 表示两个词语是统计独立的
3. PMI < 0 表示两个词语是不相关的,互斥的

PMI算法用一句话形容就是:两个词同时出现的概率越大,其相关性越大

情感倾向点互信息算法 SO-PMI

在这里插入图片描述
P w o r d P_{word} Pword 指一个基准词, P w P_{w} Pw指基准词列表, w o r d word word 指随便一个词;

SO-PMI的基本思想是:有两个情感倾向的列表,一个是正向的情感词,一个是负向的情感倾向。计算每个词与这两个列表中的每个词的PMI,看这个词更接近哪个列表,是更接近正向情感词列表还是负向情感词列表。即:

SO-PMI值> 0,表示这个词更接近正向,即褒义词
SO-PMI值 = 0,表示这个词为中性词
SO-PMI值 < 0,表示这个词更像是负面词,即贬义词

一句话形容这个算法:判断一个词更倾向于与积极词一起出现,还是与消极词一起出现。

3. 构建情感词典

参考Github项目:https://github.com/liuhuanyong/SentimentWordExpansion

1. 导入项目

在python环境中安装依赖:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ jieba

然后使用git导入项目:

git clone git@github.com:liuhuanyong/SentimentWordExpansion.git

导入项目后直接运行SOPMI.py文件就可以运行案例了。构建自己的情感词典,需要替换data/文件夹下的train.txt语料库与sentiment_words.txt情感种子词,或是修改SOPMI.py文件中的构造函数:

    def __init__(self):self.train_path = './data/train.txt' # 需要提供的训练数据语料库self.sentiment_path = './data/sentiment_words.txt' # 需要提供的情感种子词列表self.candipos_path = './data/candi_pos.txt' # 输出的正向词列表self.candineg_path = './data/candi_neg.txt' # 输出的负向词列表

2. 构建情感种子词

在SO-PMI算法中提供基准词 P w o r d P_{word} Pword 的词称为情感种子词,需要自定义,种子词的构建直接决定了最后的效果。

从预料中选择一些主观上明显感觉这个词有强烈的情感倾向的词,然后按照种子词的格式罗列下来就行。种子词的列表格式是一个词\t情感倾向\n,其中情感倾向有pos正向/积极 与 neg负向/消极,例:

解决	pos
尊敬	pos
问题	neg
严重	neg
投诉	neg
噪音	neg

博主这里提供一个构建情感种子词的工具类,方便将看着像这种格式,但是并没有用\t切分的文件转换成能直接输入的格式:

file = open('my_sentiment_words.txt', 'a')
for line in open('data/sentiment_words.txt'):line_list = line.strip().split(' ') # 词与情感倾向之间用空格切分,没有用\t切分file.write(line_list[0] + '\t' + line_list[1] + '\n')
file.flush()
file.close()

3. 使用TF-IDF方便构建情感种子词

自己去从海量的文本中找有明显情感倾向的词这也太硬核了!所以借助TF-IDF构建会方便很多。TF-IDF的算法这里就不展开了,直接上代码:

import jieba  # 分词器
import jieba.analyse
import pandas as pddef tfidf_ana(content):title_keys = jieba.analyse.extract_tags(content, topK=700, withWeight=False)  # topK为期望得到的关键词个数with open('tf_idf_words.txt', 'a') as file:for i in title_keys:file.write(i + '\n')file.flush()file.close()if __name__ == '__main__':answer_df = pd.read_csv('../coment_answer.csv')answer_list = answer_df['content'].to_list()answer_str = ''for k in answer_list:answer_str += str(k)data = tfidf_ana(answer_str)

tf_idf_words.txt这个文件中会借助TF-IDF输出700个词,从700个词中挑选情感种子词总比从语料库中找方便吧。输出格式:

拆迁
需求
附近
纠纷
受理
催促

4. 构建专业词典的效果与使用方法

以输出的candi_pos.txt为例,这些内容包括词语,pmi值,情感极性,词的长度,词性,使用情感词典时可以把所有词的权重定为1,也可以使用pmi值作为权重,来判断一句话的整体情感。

简单化,102.5088270306492,pos,3,v
不辞辛苦,99.88645456051404,pos,4,i
心怀,99.65437740515684,pos,2,n
祝愿,84.25764401332869,pos,2,v
人民大众,83.15324812078094,pos,4,nt
适时,82.92507246585465,pos,2,ad
欣喜,81.43696536070502,pos,2,a
密切,78.28173699693579,pos,2,ad
辛勤工作,77.90533206036869,pos,4,n

5. 其他说明

按照如上所述,替换掉案例中data/文件夹下的train.txt语料库与sentiment_words.txt情感种子词后,运行SOPMI.py即可得到预期效果。如果有报错请检查情感种子词格式每一行是否中间是用\t切分,结尾是否用\n换行。

在这个项目中collect_cowords函数中有一个参数词共现窗口window_size,可自行指定


http://chatgpt.dhexx.cn/article/ppar1Sdw.shtml

相关文章

在微雕中使用的电脑设计

需求是我们要在铜器上复刻很小的凹印,可以选用的技术方案还是很多:激光雕刻,篆刻、钢印。 激光雕刻有利有弊,前期复制是最方便的,激光雕刻有专门的设计软件,可以很轻松的把自己的图案运用到机器上去。制作和时间的成本都非常的低,但是激光对金属的雕刻有一个大大的缺点…

闲人闲谈PS之四十二——顾问的“禁忌之地”—制造能力计划

惯例闲话&#xff1a;上个月有幸成为乐老师乐谈IT系列培训课程的讲师&#xff0c;分享主题是&#xff0c;PS在装备制造和工程行业的应用。虽然培训规模不是很大&#xff0c;但是闲人很有信心&#xff0c;至少在小范围之内&#xff0c;参与培训的听友人来说&#xff0c;PS一直以…

ibm x201 怎么清理内部_ThinkPad X201拆解,联想Thinkpad X201拆机图解

1.jpg (25.79 KB, 下载次数: 2552) 2010-6-1 20:13 上传 ThinkPad X201掌托&#xff0c;没有防滚架&#xff0c;这个掌托就显得很软。电磁屏蔽做得很用心。 2.jpg (39.16 KB, 下载次数: 2556) 2010-6-1 20:13 上传 ThinkPad X201掌托特写&#xff0c;可以看到掌托塑料件是MITSU…

学习opencv:PS滤镜—浮雕

实现浮雕效果的算子有很多&#xff0c;效果大同小异&#xff0c;不同算子的处理结果在细节上会有所差异。事实上&#xff0c;任何一阶差分算子都可用于实现浮雕效果&#xff0c;简单起见&#xff0c;这里使用算子[-1,1]。 代码如下 #include<iostream> #include <…

ps给图片加钢印方法

给图片加一个钢印其实很简单 这样的效果只能类似钢印 简单可以按照下面的方法 准备资料 &#xff1a;一个要加钢印的图片 一个透明印章即可实现 方法&#xff1a;斜面和浮雕 一、打开图片 二、打开透明印章 三、将透明印章移动到图片中 四、进行图层设置 右击印章图层---混合…

PS钢印效果制作

PS制作钢印效果一法 转载教程:严禁做假.... 附件 1.jpg (37.05 KB) 2008-6-10 22:39 2.jpg (33.59 KB) 2008-6-10 22:39 3.jpg (38.57 KB) 2008-6-10 22:39 4.jpg (42.49 KB) 2008-6-10 22:39 5.jpg (39.2 KB) 2008-6-10 22:39 6.jpg (44.63 KB) 2008-6-10 22:39 7.jpg…

Oracle中extract()函数

oracle中extract()函数从oracle 9i中引入的,主要作用于一个date或者interval类型中截取特定的部分 extract()语法如下&#xff1a; extract ( { year | month | day | hour | minute | second | 某一时区 } from { date类型值 | interval类型值} ) 要点一&#xff1a;extract()…

oracle ora-01652:无法通过1024(在表空间SYSTEM中)拓展temp段

1.报错 2.查询拓展表空间 2.1查看表空间使用情况 SELECT UPPER(F.TABLESPACE_NAME) "表空间名",D.TOT_GROOTTE_MB "表空间大小(M)",D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.…

hpux oracle10.2.0.4下报ORA-1652 unable to extend temp segment by 128 in tablespace CARDTS

hpux oracle10.2.0.4 rac 下报ORA-1652 unable to extend temp segment by 128 in tablespace CARDTS hpux 11.31 oracle10.2.0.4 rac ,2 nodes 值得注意的是&#xff0c;报的是不能在CARDTS表空间中扩展temp段。。。 后来查询metalink 文章&#xff0c; Troubleshooting ORA-1…

原创:oracle中单行函数介绍 lt;五gt;

在SQL中有两种函数一种是单行函数&#xff0c;一种是多行函数.在sql与pl/sql中都自带了很多类型的函数,比如有字符、数字、日期、转换和混合型等多种函数用于处理单行数据,因此这些都被称为单行函数.这些函数都可以被用于select、where和oder by等子句中.下面我们就来分析单行函…

EXPDP报错:ORA-60019 creating initial extent of size 14 in tablespace of extent size 8

一、原因概述 和SecureFiles新的LOB架构相关。11g之前叫BasicFiles。在11g如果不特别指定&#xff0c;默认是会创建成BasicFiles LOB。但是在12c之后&#xff0c;LOB列在ASSM管理的表空间。默认都会创建成SecureFiles。 也就是DB_SECUREFILE初始化参数&#xff0c;在11g时&…

oracle 中 /*+ full(表名)*/ 优化详解

文章目录 hint 关键字&#xff1a; /* full(表名)*/可能遇到的问题别名为 "SELxx" hint 关键字&#xff1a; / full(表名)/ 一般来说&#xff0c;sql 优化时&#xff0c;尽量走 index&#xff0c;但不绝对有时候&#xff0c;全表扫描的效率比索引高 索引 和 全表扫…

Docker——Docker 镜像详解

Docker 镜像 Docker镜像是什么Docker镜像加载原理联合文件系统&#xff08;UnionFS&#xff09;镜像加载原理镜像分成理解 Commit镜像镜像的总结 Docker镜像是什么 Docker 容器的运行是基于宿主机的内核&#xff0c;通过linux的namespaces来实现隔离&#xff0c;相对于虚拟机而…

Docker镜像使用详解

目录 基础命令使用进阶 容器和虚拟机具有相似的资源隔离和分配优势&#xff0c;但功能不同&#xff0c;因为容器虚拟化的是操作系统而不是硬件。多个容器可以在同一台机器上运行&#xff0c;并与其他容器共享操作系统内核&#xff0c;每个容器在用户空间中作为独立进程运行。一…

docker镜像下载及docker镜像管理

文章目录 docker镜像下载镜像说明通外网主机上获取镜像官网上查看镜像的详细说明 镜像的命名方式镜像的重命名镜像的删除删除单个删除全部镜像 镜像的打包与解压包默认存放路径说明镜像打包【单个】镜像打包【多个】镜像解压 容器的导出和导入把容器导出为镜像镜像导入为容器 查…

Docker基础 - 仓库,镜像,容器详解

仓库&#xff0c;镜像&#xff0c;容器的关系 我们再回顾下仓库&#xff0c;镜像&#xff0c;容器的关系&#xff08;这是官网的图&#xff09; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NBtYxRyR-1683856218077)(null)] Docker 镜像 当运行…

Docker本地镜像推送到私有库

Docker Registry是官方提供的工具&#xff0c;可以用于构建私有镜像仓库 1. 下载镜像Docker Registry docker pull registy 2. 运行私有库Registry&#xff0c;相当于本地有个私有Docker hub docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileg…

docker镜像

docker镜像 文章目录 docker镜像1.镜像的概念2.docker镜像层3.docker存储驱动3.docker registry4.Docker Hub 1.镜像的概念 Docker镜像类似于虚拟机中的镜像&#xff0c;是一个只读的模板&#xff0c;也是一个独立的文件系统&#xff0c;包括运行容器所需的数据。 Docker镜像…

Docker入门教程:本地打包docker镜像

什么是Docker&#xff1f; Dockers是基于Go语言开发的虚拟容器技术。以前我们部署应用通常是将源代码打包成一个jar包运行&#xff0c;这样就会受到运行环境、配置环境的限制&#xff0c;而且程序也不能跨服务器运行。Docker基于Linux容器技术&#xff0c;将Java源代码、运行环…

Docker 镜像

&#xff08;一&#xff09;下载实例 &#xff08;二&#xff09;镜像基本操作 备注&#xff1a; 相同名称的镜像可以存在多个&#xff0c;即需要不同的tags版本 &#xff08;三&#xff09;使用 Dockerfile 定制镜像 &#xff08;1&#xff09;介绍 镜像的定制实际上就是定…