【01|研究背景与意义】
供应链风险是影响企业稳健经营的关键因素,但如何量化评估这一风险一直是学术研究的难点。本文复现《数量经济技术经济研究》2025年刊发的《企业供应链风险与纵向并购决策之谜》研究方法,通过文本挖掘技术从上市公司年报中提取供应链风险信息,为相关研究提供可复现的代码方案。
【02|方法概述:词典法与句频统计】
该方法基于词典法与句频统计,核心思路包括:1.构建专业词典:供应链词典(92词)与风险词典(176词)2.文本预处理:年报MD&A章节分句、清洗、分词3.句频统计:识别同时包含供应链词汇和风险词汇的句子4.指标计算:构建供应链风险相对指标 ChainRisk
计算公式:
其中:= MD&A中同时含供应链和风险词汇的句子数,= 年报全文中含风险词汇的句子数
【03|核心代码实现】
1. 专业词典加载与初始化
# 从Excel文件加载供应链风险词典df = pd.read_excel("./data/风险词典.xlsx")# 构建六大词典体系SUPPLY_CHAIN_CONCEPT = set(df.at[0, "词典"].split("、")) # 供应链概念词典SUPPLY_CHAIN_POSITION = set(df.at[1, "词典"].split("、")) # 供应链位置词典 PRODUCTION_PROCESS = set(df.at[2, "词典"].split("、")) # 生产流程词典SUPPLY_CHAIN_MANAGEMENT = set(df.at[3, "词典"].split("、")) # 供应链管理词典SUPPLY_CHAIN_OTHER = set(df.at[4, "词典"].split("、")) # 其他相关词典RISK_WORDS = set(df.at[5, "词典"].split("、")) # 风险词典# 合并供应链词典SUPPLY_CHAIN_WORDS = (SUPPLY_CHAIN_CONCEPT | SUPPLY_CHAIN_POSITION | PRODUCTION_PROCESS | SUPPLY_CHAIN_MANAGEMENT | SUPPLY_CHAIN_OTHER)
2. 文本预处理与分句
defclean_text(text):"""文本清洗:去除数字字母、保留中文字符和关键标点""" text = re.sub(r"[a-zA-Z0-9]", "", text) # 删除数字和英文字母 text = re.sub(r"\s+", "", text) # 删除空白字符 text = re.sub(r"[^\u4e00-\u9fa5,,。!?\!\?]", "", text) # 保留中文和标点return textdefsplit_annual_report_sentences(text):"""将年报全文分割为句子""" sentences = re.split(r"[。!?\!\?]", text) sentences = [s.strip() for s in sentences iflen(s.strip()) > 2] # 过滤短句return sentences
3. 核心风险评估函数
defanalyze_supply_chain_risk(mda_text, annual_report_text):"""分析供应链风险核心函数"""# 文本预处理和分句 cleaned_mda = clean_text(mda_text) mda_sentences = split_mda_sentences(cleaned_mda) cleaned_annual_report = clean_text(annual_report_text) annual_report_sentences = split_annual_report_sentences(cleaned_annual_report)# 计算T_i,t:MD&A中同时含供应链和风险词汇的句子数 ti_sentences = 0for sentence in mda_sentences: words = jieba.lcut(sentence) has_risk = any(word in RISK_WORDS for word in words) has_supply_chain = any(word in SUPPLY_CHAIN_WORDS for word in words) has_positive = any(word in POSITIVE_WORDS for word in words)# 关键判断逻辑:有风险词、有供应链词、无积极词ifnot has_positive and has_risk and has_supply_chain: ti_sentences += 1# 计算N_i,t:年报全文中含风险词汇的句子数 ni_sentences = 0for sentence in annual_report_sentences: words = jieba.lcut(sentence) has_risk = any(word in RISK_WORDS for word in words) has_positive = any(word in POSITIVE_WORDS for word in words)ifnot has_positive and has_risk: ni_sentences += 1# 计算供应链风险指标 chain_risk = round(ti_sentences / ni_sentences, 5) if ni_sentences > 0else0return {"ti_sentences": ti_sentences, # 供应链风险句子数"ni_sentences": ni_sentences, # 总风险句子数 "chain_risk": chain_risk, # 供应链风险指标"mda_sentences": len(mda_sentences), # MD&A句子总数"annual_report_sentences": len(annual_report_sentences) # 年报句子总数 }
【04|数据准备与处理】
数据源结构:
数据合并与处理:
# 读取数据mda_df = pd.read_csv("./data/上市公司年报/年报mda.csv", dtype={"股票代码": str})full_df = pd.read_csv("./data/上市公司年报/年报全文.csv", dtype={"股票代码": str})# 合并MD&A和全文数据company_df = pd.merge(mda_df, full_df, on=["股票代码", "年份"], how="left")# 应用风险评估函数company_df["result"] = company_df.apply(lambda row: analyze_supply_chain_risk( row["管理层讨论文本内容"], row["全文内容"] ), axis=1)
【05|结果输出与统计分析】
处理完成后,数据框包含完整的风险评估结果:输出字段说明:
- • mda_sentences:MD&A章节句子数量
- • annual_report_sentences:年报全文句子数量
- • chain_risk:供应链风险指标(核心结果)
描述性统计结果:
| |
| 样本数量 | |
| 平均MD&A句子数 | |
| 平均全文句子数 | |
| 平均供应链风险指标 | |
| 风险句子数范围 | |
【06|方法优势与适用性】
技术优势:
1.词典专业性:基于文献构建的完整词典体系2.处理准确性:考虑积极词汇排除,避免误判3.可复现性:完整的端到端处理流程4.可扩展性:易于适配其他文本分析任务
适用场景:
本复现工作不仅提供了具体的技术实现,更展示了文本挖掘方法在经济学研究中的应用潜力。通过将非结构化的文本信息转化为结构化数据,为供应链风险管理研究提供了新的方法论支持。
参考文献:蓝发钦, 胡晓敏, 国文婷, 等. 企业供应链风险与纵向并购决策之谜:来自文本挖掘的经验证据[J]. 数量经济技术经济研究, 2025, 42(01): 116-135.代码说明:本文完整复现原文献方法,基于Python实现,包含数据预处理、词典匹配、指标计算全流程。
欢迎在评论区交流文本挖掘的技术细节与研究应用!
代码领取方式
转发本推文到朋友圈
添加客服
发送代码编号
发送保留2小时并集齐10个点赞的截图
即可免费领取代码