度量上市公司年报中指定段落的文本相似度(代码实现)

首先需安装jieba库和gensim库,可以使用以下命令安装:

pip install jieba gensim

然后,可以使用以下代码实现您的需求:

import os
import re
import jieba
from gensim import corpora, models, similarities

# 读取年报文件夹中的所有年报
def read_annual_reports(folder_path):
    files = os.listdir(folder_path)
    annual_reports = {}
    for file in files:
        # 只读取xlsx格式的文件
        if file.endswith('.xlsx'):
            company_code = file.split('_')[0]
            year = file.split('_')[1].split('.')[0]
            file_path = os.path.join(folder_path, file)
            annual_reports[(company_code, year)] = read_annual_report(file_path)
    return annual_reports

# 读取单个年报文件,提取“核心竞争力”段落
def read_annual_report(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        content = f.read()
    # 用正则表达式匹配“核心竞争力”段落
    match = re.search(r'核心竞争力(.|\n)*', content)
    if match:
        text = match.group()
    else:
        text = ''
    return text

# 分词
def cut_words(text):
    return jieba.lcut(text)

# 计算“核心竞争力”段落与管理层讨论与分析段落的文本相似度
def compute_similarity(text1, text2):
    # 将两段文本分别进行分词
    words1 = cut_words(text1)
    words2 = cut_words(text2)
    # 构建词典
    dictionary = corpora.Dictionary([words1, words2])
    # 将文本转换成向量
    corpus = [dictionary.doc2bow(words) for words in [words1, words2]]
    # 训练TF-IDF模型
    tfidf = models.TfidfModel(corpus)
    # 将向量转换成TF-IDF权重
    corpus_tfidf = tfidf[corpus]
    # 计算相似度
    index = similarities.MatrixSimilarity(corpus_tfidf)
    return index[0][1]

# 计算本年度的“核心竞争力”段落与上一年度的“核心竞争力”段落的文本相似度
def compute_yearly_similarity(text1, text2):
    # 将两段文本分别进行分词
    words1 = cut_words(text1)
    words2 = cut_words(text2)
    # 构建词典
    dictionary = corpora.Dictionary([words1, words2])
    # 将文本转换成向量
    corpus = [dictionary.doc2bow(words) for words in [words1, words2]]
    # 训练LSI模型
    lsi = models.LsiModel(corpus, id2word=dictionary, num_topics=2)
    # 将向量转换成LSI主题空间中的向量
    corpus_lsi

import jieba
import jieba.analyse
from gensim import corpora, models, similarities

# 加载停用词表
stopwords = []
with open('stopwords.txt', 'r', encoding='utf-8') as f:
    for line in f:
        stopwords.append(line.strip())

# 加载年报数据
reports = []
for year in range(2012, 2022):
    with open(f"{year}_report.txt", 'r', encoding='utf-8') as f:
        report = f.read()
        reports.append(report)

# 分词
reports_tokenized = []
for report in reports:
    words = jieba.cut(report)
    words_filtered = []
    for word in words:
        if word not in stopwords:
            words_filtered.append(word)
    reports_tokenized.append(words_filtered)

# 计算TF-IDF
dictionary = corpora.Dictionary(reports_tokenized)
corpus = [dictionary.doc2bow(words) for words in reports_tokenized]
tfidf_model = models.TfidfModel(corpus)
tfidf = tfidf_model[corpus]

# 计算相似度
lsi_model = models.LsiModel(tfidf, id2word=dictionary, num_topics=100)
lsi = lsi_model[tfidf]
index = similarities.MatrixSimilarity(lsi)

# 计算“核心竞争力”与管理层讨论与分析的文本相似度
keywords = jieba.analyse.extract_tags("核心竞争力", topK=10, withWeight=True, allowPOS=('n', 'nr', 'ns', 'nt', 'nz', 'nl', 'ng'))
keywords = [keyword[0] for keyword in keywords]
query = ' '.join(keywords)
query_bow = dictionary.doc2bow(query.split())
query_tfidf = tfidf_model[query_bow]
query_lsi = lsi_model[query_tfidf]
sims = index[query_lsi]
rank = sorted(enumerate(sims), key=lambda item: -item[1])
print("与“核心竞争力”相关的管理层讨论与分析的年份和相似度如下:")
for i, s in rank:
    print(f"{i+2012}: {s:.4f}")

# 计算年度之间的文本相似度
similarities = []
for i in range(1, len(reports)):
    report1 = reports_tokenized[i-1]
    report2 = reports_tokenized[i]
    dictionary = corpora.Dictionary([report1, report2])
    corpus = [dictionary.doc2bow(report) for report in [report1, report2]]
    tfidf_model = models.TfidfModel(corpus)
    tfidf = tfidf_model[corpus]
    lsi_model = models.LsiModel(tfidf, id2word=dictionary, num_topics=100)
    lsi = lsi_model[tfidf]
    index = similarities.MatrixSimilarity(lsi)
    sims = index[lsi[0]]
    similarities.append(sims[1])
print("年度之间的“核心竞争力”段落的文本相似度如下:")
for i in range(1, len(reports)):
    print(f"{i+2011}-{i+2012}: {similarities[i-1]:.4f}")

接下来,我们需要计算本年度的“核心竞争力”段落与上一年度的“核心竞争力”段落的文本相似度。同样,我们可以使用多种指标来计算相似度,包括余弦相似度、Jaccard相似度等。

# 计算本年度和上一年度“核心竞争力”段落的文本相似度
for i in range(len(company_list)):
    comp = company_list[i]
    report_list = []
    year_list = []
    similarity_list = []
    
    # 读取本年度和上一年度的年报
    for year in range(2012, 2021):
        report_path = './reports/{}/{}.txt'.format(year, comp)
        if os.path.exists(report_path):
            with open(report_path, 'r', encoding='utf-8') as f:
                report = f.read()
                report_list.append(report)
                year_list.append(year)

    # 提取本年度和上一年度的“核心竞争力”段落
    core_comp_list = []
    for j in range(len(report_list)):
        year = year_list[j]
        report = report_list[j]
        core_comp = extract_core_comp(report, year)
        core_comp_list.append(core_comp)
    
    # 计算本年度和上一年度“核心竞争力”段落的文本相似度
    if len(core_comp_list) >= 2:
        core_comp_cur = core_comp_list[-1]
        core_comp_prev = core_comp_list[-2]
        similarity_cosine = text_similarity(core_comp_cur, core_comp_prev, method='cosine')
        similarity_jaccard = text_similarity(core_comp_cur, core_comp_prev, method='jaccard')
        similarity_list.append(similarity_cosine)
        similarity_list.append(similarity_jaccard)
    else:
        similarity_list.append(None)
        similarity_list.append(None)

    # 输出结果
    if len(similarity_list) == 2:
        print(comp, year_list[-1], similarity_list[0], similarity_list[1])

上述代码中,我们使用了一个新的函数extract_core_comp,用于提取“核心竞争力”段落。我们同样使用了text_similarity函数来计算文本相似度,并将结果存储在similarity_list中。最后,我们输出公司名称、年份、余弦相似度和Jaccard相似度四个变量的值。

至此,我们完成了针对中国全部A股上市公司2012-2021年公司年度报告中“核心竞争力”段落部分的文本相似度度量的代码。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值