查看原文
其他

使用中文MD&A数据集训练word2vec预训练模型, 可扩展或新建会计金融等领域的情感词典

大邓 大邓和他的Python
2024-09-09

一、介绍

使用2001-2021年的管理层讨论与分析mda数据(1.45G),训练出的中国A股市场词向量模型,词汇量789539, 模型文件 650M 。可广泛用于经济管理等领域概念(情感)词典的构建或扩展。

训练环境为内存256G的windows服务器(日常办公电脑内存16G居多), 2.0.0版本cntext库(该版本暂不开源,最新可获取的版本为1.8.4)。在该环境下,我也尝试使用14G的年报数据,训练了两天,跑不出结果,256G的内存基本用光了。所以cntext训练模型,适合的数据规模是1G左右。


扯远了,回归正题,模型文件

  • mda01-21.200.6.bin
  • mda01-21.200.6.bin.vectors.npy

参数解读

  • mda01-21 使用2001-2021年度的mda数据训练
  • 200 嵌入的维度数,即每个词的向量长度是200
  • 6 词语上下文的窗口是6
关于为什么确定为200和6, 可以参考这篇词嵌入技术在社会科学领域进行数据挖掘常见39个FAQ汇总


二、导入模型

需要用到两个自定义函数load_w2v、expand_dictionary,源代码太长,为了提高阅读体验, 放在文末。大家记得用这两个函数前一定要先导入

#先导入load_w2v、expand_dictionary函数源代码


#读取模型文件
wv = load_w2v(w2v_path='model/mda01-21.200.6.bin')
wv
Loading word2vec model...

<gensim.models.keyedvectors.KeyedVectors at 0x7fcc91900a90>


三、wv的使用

  • 查看词汇量
  • 查询某词向量
  • 查看多个词的均值向量

更多内容,建议查看下gensim库的文档

#词汇量
len(wv.index_to_key)
789539


#查询某词的词向量
wv.get_vector('创新')
array([ 4.34389877e+00, -4.93447453e-01, 2.17293240e-02, 1.90846980e+00,
8.75901580e-01, -7.95542181e-01, -1.12950909e+00, 7.44228721e-01,
7.38122821e-01, 6.42377853e-01, 3.99175316e-01, 2.17924786e+00,
......

5.80206394e-01, 5.55441022e-01, 1.91946900e+00, -1.89253080e+00,
1.77489519e+00, -3.15311766e+00, 6.48138940e-01, 1.15823770e+00,
-2.54519200e+00, -1.03516951e-01, 1.15724599e+00, -1.83681571e+00,
-9.87860620e-01, -1.99984312e+00, 2.76547909e-01, 8.02748859e-01,
1.99196494e+00, -1.43310416e+00, -2.03039408e+00, -7.19777197e-02],
dtype=float32)


#查询多个词的词向量
wv.get_mean_vector(['创新''研发'])
array([ 0.17623448, -0.02220692, -0.01040847, 0.03616136, 0.04931263,
-0.06220303, -0.02846557, -0.00156435, 0.04524047, 0.03185674,
0.01104859, 0.06962118, -0.01969986, -0.10831943, -0.0524368 ,
0.00623383, -0.04149605, -0.004912 , 0.13154642, -0.04317038,
......
0.01349441, 0.1410133 , -0.05283241, 0.03687092, -0.02535007,
0.00415636, 0.05841105, 0.07389537, -0.13176979, 0.06759793,
-0.092868 , 0.01370211, 0.06616284, -0.09137756, -0.01640504,
0.06095972, -0.05725639, -0.04122292, 0.00598698, 0.02904861,
0.0442962 , 0.07399555, -0.04657119, -0.07636161, 0.03204561],
dtype=float32)

有了每个词或者概念的向量,可以结合cntext旧版本单语言模型内的态度偏见的度量。


四、扩展词典

做词典法的文本分析,最重要的是有自己的领域词典。之前受限于技术难度,文科生的我也一直在用形容词的通用情感词典。现在依托word2vec技术, 可以加速人工构建的准确率和效率。

下面是在 mda01-21.200.6.bin 上做的词典扩展测试,函数expand_dictionary会根据种子词选取最准确的topn个词。

#短视主义词  实验
expand_dictionary(wv=wv, 
                  seedwords=['抓紧''立刻''月底''年底''年终''争取''力争'],
                  topn=30)
['抓紧',
'立刻',
'月底',
'年底',
'年终',
'争取',
'力争',
'争取',
'力争',
'年内',
'月底',
'年底',
'尽早',
'3月底',
'尽快',
'抓紧',
'6月份',
'4月份',
'月份',
'工作力争',
'努力争取',
'工作争取',
'10月底',
'年内实现',
'年底完成',
'中旬',
'7月份',
'9月底',
'有望',
'月底前',
'早日',
'全力',
'继续',
'月初',
'努力',
'确保',
'8月份']


expand_dictionary(wv=wv, 
                  seedwords=['团结''拼搏',  '克服',  '勇攀高峰',  '友善',  '进取'],
                  topn=30)
['团结',
'拼搏',
'克服',
'勇攀高峰',
'友善',
'进取',
'拼搏',
'艰苦奋斗',
'坚定信念',
'团结拼搏',
'上下同心',
'团结',
'顽强拼搏',
'勇于担当',
'团结一致',
'团结奋进',
'精诚团结',
'齐心协力',
'开拓进取',
'奋进',
'团结一心',
'实干',
'同心协力',
'团结协作',
'锐意进取',
'积极进取',
'奋力拼搏',
'拼搏精神',
'努力拼搏',
'进取',
'奋发有为',
'扎实工作',
'同心同德',
'拼搏进取',
'脚踏实地',
'励精图治']


expand_dictionary(wv=wv, 
                  seedwords=['创新''科技',  '研发',  '技术',  '标准'],
                  topn=30)
['创新',
'科技',
'研发',
'技术',
'标准',
'创新',
'技术创新',
'技术研发',
'科技创新',
'先进技术',
'自主创新',
'前沿技术',
'关键技术',
'科研',
'新技术',
'创新性',
'研发创新',
'产品研发',
'基础研究',
'产品开发',
'集成创新',
'核心技术',
'自主研发',
'技术应用',
'技术集成',
'前沿科技',
'技术标准',
'工艺技术',
'科技成果',
'技术开发',
'尖端技术',
'工程技术',
'技术相结合',
'科学技术',
'工艺']



expand_dictionary(wv=wv, 
                  seedwords=['竞争''竞争力'],
                  topn=30)
['竞争',
'竞争力',
'竞争能力',
'竞争优势',
'市场竞争',
'竞',
'市场竞争力',
'竞争实力',
'参与市场竞争',
'国际竞争',
'市场竞争能力',
'核心竞争力',
'激烈竞争',
'市场竞争优势',
'竞争态势',
'参与竞争',
'竞争力重要',
'竞争对手',
'创新能力',
'综合竞争力',
'价格竞争',
'之间竞争',
'核心竞争能力',
'未来市场竞争',
'国际竞争力',
'影响力竞争力',
'国际化竞争',
'行业竞争',
'综合竞争能力',
'竞争日趋激烈',
'产品竞争力',
'竞争力影响力']



expand_dictionary(wv=wv, 
                  seedwords=['疫情''扩散''防控''反复''冲击'],
                  topn=30)
['疫情',
'扩散',
'防控',
'反复',
'冲击',
'蔓延',
'疫情冲击',
'疫情爆发',
'新冠疫情',
'新冠肺炎',
'疫情蔓延',
'疫情暴发',
'肆虐',
'本次疫情',
'冲击疫情',
'新冠病毒',
'疫情扩散',
'全球蔓延',
'疫情影响',
'病毒疫情',
'肺炎疫情',
'击',
'持续蔓延',
'疫情持续',
'各地疫情',
'疫情突然',
'疫情全球',
'疫情传播',
'疫情反复',
'散发',
'变异毒株',
'疫情导致',
'疫情肆虐',
'全球疫情',
'全球新冠']


expand_dictionary(wv=wv, 
                  seedwords=['旧''老''后''落后'],
                  topn=30)
['旧',
'老',
'后',
'落后',
'旧',
'老',
'陈旧',
'老旧',
'淘汰',
'高能耗',
'低效率',
'设备陈旧',
'能耗高',
'老旧设备',
'落后工艺',
'进行改造',
'工艺落后',
'技术落后',
'翻新',
'更新改造',
'改造',
'更新',
'替换',
'改造更新',
'旧设备',
'污染重',
'淘汰一批',
'拆除',
'污染严重',
'简陋',
'产能落后',
'相对落后',
'产能淘汰',
'效率低下']


from gensim.models import KeyedVectors
from pathlib import Path


def load_w2v(w2v_path):
    """
    Load word2vec model

    Args:
        w2v_path (str): path of word2vec model

    Returns:
        model: word2vec model
    """

    print('Loading word2vec model...')
    model = KeyedVectors.load(w2v_path)
    return model


def expand_dictionary(wv, seedwords, topn=100):
    """
    According to the seed word file, select the top n words with the most similar semantics and save them in the directory save_dir.
    
    Args:
        wv (Word2VecKeyedVectors): the word embedding model
        seedwords (list): 种子词
        topn (int, optional): Set the number of most similar words to retrieve to topn. Defaults to 100.
        save_dir (str, optional): the directory to save the candidate words. Defaults to 'Word2Vec'.
    
    Returns:
    """

    simidx_scores = []

    similars_candidate_idxs = [] #the candidate words of seedwords
    dictionary = wv.key_to_index
    seedidxs = [] #transform word to index
    for seed in seedwords:
        if seed in dictionary:
            seedidx = dictionary[seed]
            seedidxs.append(seedidx)
    for seedidx in seedidxs:
        # sims_words such as [('by', 0.99984), ('or', 0.99982), ('an', 0.99981), ('up', 0.99980)]
        sims_words = wv.similar_by_word(seedidx, topn=topn)
        #Convert words to index and store them
        similars_candidate_idxs.extend([dictionary[sim[0]] for sim in sims_words])
    similars_candidate_idxs = set(similars_candidate_idxs)
    
    for idx in similars_candidate_idxs:
        score = wv.n_similarity([idx], seedidxs)
        simidx_scores.append((idx, score))
    simidxs = [w[0for w in sorted(simidx_scores, key=lambda k:k[1], reverse=True)]

    simwords = [str(wv.index_to_key[idx]) for idx in simidxs][:topn]

    resultwords = []
    resultwords.extend(seedwords)
    resultwords.extend(simwords)
    
    return resultwords


精选文章

管理世界 | 使用文本分析词构建并测量短视主义

管理世界 | 使用 经营讨论与分析 测量 企业数字化指标

管理世界 | 用正则表达式、文本向量化、线性回归算法从md&a数据中计算 「企业融资约束指标

数据集 | 2001-2021年A股上市公司年报&管理层讨论与分析

采购合同数据集 | 政府采购何以牵动企业创新

可视化 | 睡前消息的社会化抚养、科学技术话题可视化

可视化 | 词嵌入模型用于计算社科领域刻板印象等信息(含代码)

可视化 | 绘制《三体》人物关系网络图

可视化 | 使用决策树分析小红书帖子数据(含代码)

可视化99-21年地方政府报告关键词变化趋势

Nature | 通用中英文六维语义情感词典

B站社会科学文本分析视频合集

词嵌入技术在社会科学领域进行数据挖掘常见39个FAQ汇总

文本分析 | 中国企业高管团队创新注意力(含代码)

文本分析 | MD&A 信息含量指标构建代码实现

金融研究 | 使用Python构建「关键审计事项信息含量」

金融研究 | 文本相似度计算与可视化

视频分享 | 文本分析在经管研究中的应用

使用 Word2Vec 和 TF-IDF 计算五类企业文化

如何用「图嵌入」将企业、高管职业经历表征为向量数据

JM2022综述 | 黄金领域: 为营销研究(新洞察)采集网络数据

MS | 使用网络算法识别创新的颠覆性与否

认知的测量 | 向量距离vs语义投影

Asent库 | 英文文本数据情感分析

PNAS | 文本网络分析&文化桥梁Python代码实现

PNAS | 使用语义距离测量一个人的创新力(发散思维)得分

PNAS | 历史文本中的语言积极性反映了动态的环境和心理因素(含Python代码)

Nature | 通用中英文六维语义情感词典

正念爱好者的 twitter 语言风格有何不同?

tomotopy | 速度最快的LDA主题模型

数据集 | cctv新闻联播文稿数据

数据集 | 睡前消息文稿数据集

EDGAR | 25年数据的预训练词向量模型(含代码)

2G数据集 | 80w知乎用户问答数据

借助chatGPT更高效地学习Python文本分析

word_in_context | 查看某类词的上下文,更好的理解文本数据


获取模型

感谢支持,接下来是模型 mda01-21.200.6.bin 下载方式

继续滑动看下一个
大邓和他的Python
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存