import os
from pyltp import SentenceSplitter, Segmentor, Postagger, Parser
import openpyxl
import pandas as pd
import os
import xlsxwriter
#####【!!!注意:检查各个部分之间是否存在相同的变量,避免导致程序报错】
##### 1_依存句法提取主语和主语修饰语(改) #####
# 加载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) # 加载依存句法分析模型
# 打开文件,使用'r'模式表示只读
def Grab_word(file_name,file_content):
# 分句
sentences = SentenceSplitter.split(file_content)
# 创建一个新的Excel工作簿
workbook = openpyxl.Workbook()
# 选择默认的工作表
worksheet = workbook.active
# 遍历每个分句
for num in range(0,len(sentences)):
if len(sentences[num])<70 and len(sentences[num])>4: #不可能有过长/过短的句子,省计算【?有待商榷】(结果显示可以较好的过滤数据表格式内容)
# *分词
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文件行数和列数的大小是有限的,所以需要删除“因不符合if条件而跳过执行”留下的空白行
# 获取工作表中的所有行
rows = list(worksheet.iter_rows())
# 遍历每一行
for row in rows:
# 判断是否为空白行
if all(cell.value is None for cell in row):
# 删除空白行
worksheet.delete_rows(row[0].row, 1)
# 设置保存地址
save_path = f'C:/Users/86189/Desktop/管理层讨论与分析_词汇/{file_name}.xlsx' # 替换为你的保存路径
# 尝试保存工作簿
try:
workbook.save(save_path)
print("文件保存成功。")
except Exception as e:
print(f"保存文件时出错: {e}")
# # 检查文件夹是否存在,如果不存在则创建
# directory = os.path.dirname(save_path)
# if not os.path.exists(directory):
# os.makedirs(directory)
# 代码解释:
# 首先,我们需要加载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)):
name=name_list[i]
content=content_list[i]
Grab_word(name,content)
# 释放模型
segmentor.release()
postagger.release()
parser.release()