3_提取所有句子中的主语和主语修饰语【“依存句法”之“MD&A分析”】

文章介绍了如何使用Python的LTP库进行中文文本的依存句法分析,提取主语和主语修饰语,并将结果整理到Excel文件中。同时,还展示了如何遍历多个文本文件和按年度合并Excel文件的过程。
摘要由CSDN通过智能技术生成
import os
from pyltp import SentenceSplitter, Segmentor, Postagger, Parser
import pandas as pd
import openpyxl
import pandas as pd
import os
import xlsxwriter

#####【!!!注意:检查各个部分之间是否存在相同的变量,避免导致程序报错】

##### 1_依存句法提取主语和主语修饰语(改) #####
# 待分析的句子
# 打开文件,使用'r'模式表示只读
def Grab_word(file_name,file_content):
    # 加载LTP模型
    LTP_DIR = 'D:\ltp_3.4.0\ltp_data_v3.4.0'  # LTP模型目录的路径
    cws_model_path = os.path.join(LTP_DIR, 'cws.model')  # 分词模型路径
    pos_model_path = os.path.join(LTP_DIR, 'pos.model')  # 词性标注模型路径
    par_model_path = os.path.join(LTP_DIR, 'parser.model')  # 依存句法分析模型路径
    segmentor = Segmentor(cws_model_path)  # 加载分词模型
    postagger = Postagger(pos_model_path)  # 加载词性标注模型
    parser = Parser(par_model_path)  # 加载依存句法分析模型

    # 分句
    sentences = SentenceSplitter.split(file_content)

    # 创建一个新的Excel工作簿
    workbook = openpyxl.Workbook()
    # 选择默认的工作表
    worksheet = workbook.active

    # 遍历每个分句
    for num in range(0,len(sentences)):
        # *分词
        words = segmentor.segment(sentences[num])
        # 词性标注
        postags = postagger.postag(words)
        # 依存句法分析
        arcs = parser.parse(words, postags)
        # 找到主语和主语修饰语
        order = 0 # 用于为第一个for遍历的“主语”元素进行排序,便于后续在word中定位找到对应的词汇
        subject = []
        subject_modifier = []
        for arc in arcs:
            ### 找出主语——主谓关系分析
            if arc[1] == 'SBV' and words[arc[0]-1]!=arc and postags[order]=="n": # 首先满足主谓关系,其次判断不是关系中的谓语,词性为名词【 words[arc[0]-1] 处理说明:ROOT节点的索引是 0 ,第一个词开始的索引依次为1,2,3,···】
                subject.append(words[order])
                order2 = 0 # 用于为第二个for遍历的“主语修饰语”元素进行排序
                for arc2 in arcs:
                    ### 找出主语修饰语——定中关系分析
                    if arc2[0] == order+1 and arc2[1] == 'ATT' and postags[order2]=="n": # 找到主语后随后立即寻找和该主语相关的修饰语,词性为名词【其中:order+1 起到关联主语的作用】
                        subject_modifier.append(words[order2])
                    order2 = order2+1
            order = order+1

        # 转化为字符串类型
        subject_str=','.join(subject)
        subject_modifier_str=','.join(subject_modifier)

        # *遍历“主语”和“主语修饰语”列表,将内容添加到同一行的两个格子里
        worksheet.cell(row=num+2, column=1, value=file_name)
        worksheet.cell(row=num+2, column=2, value=num)
        worksheet.cell(row=num+2, column=3, value=subject_str) # 此处row和column起始数值均为1
        worksheet.cell(row=num+2, column=4, value=subject_modifier_str)
        worksheet.cell(row=num+2, column=5, value=sentences[num])
        # 在第一行加入索引
        index_1 = "文件名"
        worksheet.cell(row=1, column=1, value=index_1)
        index_2 = "句子顺序"
        worksheet.cell(row=1, column=2, value=index_2)
        index_3 = "主语"
        worksheet.cell(row=1, column=3, value=index_3)
        index_4 = "主语修饰语"
        worksheet.cell(row=1, column=4, value=index_4)
        index_5 = "句子内容"
        worksheet.cell(row=1, column=5, value=index_5)

    # *指定保存位置并保存Excel文件(注意:文件名不许重叠)
    save_path = f'C:/Users/86189/Desktop/管理层讨论与分析_词汇/{file_name}.xlsx'  # 替换为你的保存路径

    # 检查文件夹是否存在,如果不存在则创建
    directory = os.path.dirname(save_path)
    if not os.path.exists(directory):
        os.makedirs(directory)

    # 尝试保存工作簿
    try:
        workbook.save(save_path)
        print("文件保存成功。")
    except Exception as e:
        print(f"保存文件时出错: {e}")

    # 释放模型
    segmentor.release()
    postagger.release()
    parser.release()

    # 代码解释:
    # 首先,我们需要加载LTP模型,包括分词模型、词性标注模型和依存句法分析模型。
    # 然后,我们初始化分词器、词性标注器和依存句法分析器。
    # 接下来,我们将待分析的句子进行分句,然后对每个句子进行分词、词性标注和依存句法分析。
    # 在依存句法分析结果中,我们通过遍历弧(arc)来找到主谓关系(SBV),并获取主语和主语修饰语。
    # 最后,我们输出主语和主语修饰语的结果,并写入excel文件中


##### 2_遍历所有文件夹中的txt文件(改) #####
for year in range(2001,2023):
    file_path = f'C:/Users/86189/Desktop/管理层讨论与分析_文本汇总/data_{year}.xlsx'
    file_data = pd.read_excel(file_path)
    name_list = file_data['文件名']
    content_list = file_data['文件内容']

    for i in range(0,len(name_list)+1):
        name=name_list[i]
        content=content_list[i]
        Grab_word(name,content)


##### 3_合并同一年所有企业对应的Excel文件 #####
import os
import pandas as pd

def Merge_excel(folder_path, output_file ,year_time):
    # 获取文件夹中所有Excel文件的路径
    excel_files = [os.path.join(folder_path, f) for f in os.listdir(folder_path) if f.endswith('.xlsx') or f.endswith('.xls')]
    # 初始化一个空的DataFrame,用于存储合并后的数据
    merged_df = pd.DataFrame()
    # 遍历所有Excel文件,逐个加载并合并
    for file in excel_files:
        df = pd.read_excel(file, engine='openpyxl')
        filename = os.path.splitext(file)[0]
        if filename[-10:] == f"{year_time}-12-31": # 判断指定年份,并确定是年末年度报告
            # 如果这是第一个文件,直接将其赋值给merged_df
            if merged_df.empty:
                merged_df = df.copy()
            else:
                # 否则,使用concat方法按照列名合并数据
                # 假设所有文件都有相同的列名,并且你想要保留所有的列
                merged_df = pd.concat([merged_df, df], axis=0, ignore_index=True)
    # 将合并后的DataFrame保存到新的Excel文件
    merged_df.to_excel(output_file, index=False, engine='openpyxl')
    print(f"合并后文件夹被保存为{output_file}")

for time in range(2001,2023):
    # 指定包含Excel文件的文件夹路径
    folder_path = 'C:/Users/86189/Desktop/管理层讨论与分析_词汇'
    # 指定输出文件的名称和路径
    output_file = f'C:/Users/86189/Desktop/管理层讨论与分析_词汇汇总/{time}/{time}_merge.xlsx'
    # 调用函数进行合并
    Merge_excel(folder_path, output_file,time)


  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值