Files
gangyan/langchain-chat/tests/test_textrank.py

77 lines
62 KiB
Python
Raw Normal View History

import multiprocessing
import re
import time
import networkx as nx
import numpy as np
from textrank4zh import TextRank4Keyword, TextRank4Sentence
from joblib import Parallel, delayed, parallel_backend
import logging
nx.from_numpy_matrix = nx.from_numpy_array
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
# 示例文本
text = """中华人民共和国国民经济和社会发展第十四个五年20212025年规划和2035年远景目标纲要根据《中共中央关于制定国民经济和社会发展第十四个五年规划和二三五年远景目标的建议》编制主要阐明国家战略意图明确政府工作重点引导规范市场主体行为是我国开启全面建设社会主义现代化国家新征程的宏伟蓝图是全国各族人民共同的行动纲领。第一篇 开启全面建设社会主义现代化国家新征程十四五时期是我国全面建成小康社会、实现第一个百年奋斗目标之后乘势而上开启全面建设社会主义现代化国家新征程、向第二个百年奋斗目标进军的第一个五年。第一章 发展环境我国进入新发展阶段发展基础更加坚实发展条件深刻变化进一步发展面临新的机遇和挑战。第一节 决胜全面建成小康社会取得决定性成就十三五时期是全面建成小康社会决胜阶段。面对错综复杂的国际形势、艰巨繁重的国内改革发展稳定任务特别是新冠肺炎疫情严重冲击以习近平同志为核心的党中央不忘初心、牢记使命团结带领全党全国各族人民砥砺前行、开拓创新奋发有为推进党和国家各项事业。全面深化改革取得重大突破全面依法治国取得重大进展全面从严治党取得重大成果国家治理体系和治理能力现代化加快推进中国共产党领导和我国社会主义制度优势进一步彰显。经济运行总体平稳经济结构持续优化国内生产总值突破100万亿元。创新型国家建设成果丰硕在载人航天、探月工程、深海工程、超级计算、量子信息、复兴号高速列车、大飞机制造等领域取得一批重大科技成果。决战脱贫攻坚取得全面胜利5575万农村贫困人口实现脱贫困扰中华民族几千年的绝对贫困问题得到历史性解决创造了人类减贫史上的奇迹。农业现代化稳步推进粮食年产量连续稳定在1.3万亿斤以上。1亿农业转移人口和其他常住人口在城镇落户目标顺利实现区域重大战略扎实推进。污染防治力度加大主要污染物排放总量减少目标超额完成资源利用效率显著提升生态环境明显改善。金融风险处置取得重要阶段性成果。对外开放持续扩大共建一带一路成果丰硕。人民生活水平显著提高教育公平和质量较大提升高等教育进入普及化阶段城镇新增就业超过6000万人建成世界上规模最大的社会保障体系基本医疗保险覆盖超过13亿人基本养老保险覆盖近10亿人城镇棚户区住房改造开工超过2300万套。新冠肺炎疫情防控取得重大战略成果应对突发事件能力和水平大幅提高。公共文化服务水平不断提高文化事业和文化产业繁荣发展。国防和军队建设水平大幅提升军队组织形态实现重大变革。国家安全全面加强社会保持和谐稳定。十三五规划目标任务胜利完成我国经济实力、科技实力、综合国力和人民生活水平跃上新的大台阶全面建成小康社会取得伟大历史性成就中华民族伟大复兴向前迈出了新的一大步社会主义中国以更加雄伟的身姿屹立于世界东方。第二节 我国发展环境面临深刻复杂变化当前和今后一个时期我国发展仍然处于重要战略机遇期但机遇和挑战都有新的发展变化。当今世界正经历百年未有之大变局新一轮科技革命和产业变革深入发展国际力量对比深刻调整和平与发展仍然是时代主题人类命运共同体理念深入人心。同时国际环境日趋复杂不稳定性不确定性明显增加新冠肺炎疫情影响广泛深远世界经济陷入低迷期经济全球化遭遇逆流全球能源供需版图深刻变革国际经济政治格局复
def process_text_segment(text_segment, num_sentences):
tr4w = TextRank4Keyword()
tr4w.analyze(text=text_segment, lower=True, window=5)
keywords = [(item.word, item.weight) for item in tr4w.get_keywords(30, word_min_len=4)]
tr4s = TextRank4Sentence()
tr4s.analyze(text=text_segment, lower=True, source='all_filters')
summaries = [item.sentence for item in tr4s.get_key_sentences(num=num_sentences)]
return keywords, summaries
def split_text_by_sentences(text, n_parts):
"""Split the text into n_parts based on sentences using regular expressions."""
sentences = re.split(r'(?<!\w\.\w.)(?<![A-Z][a-z]\.)(?<=\.|\?|\!)\s', text)
k, m = divmod(len(sentences), n_parts)
return [' '.join(sentences[i * k + min(i, m):(i + 1) * k + min(i + 1, m)]) for i in range(n_parts)]
from nltk.tokenize import sent_tokenize
def split_text_balanced(text, n_parts):
sentences = sent_tokenize(text)
min_sentences_per_part = 10
n_parts = max(1, min(n_parts, len(sentences) // min_sentences_per_part))
k, m = divmod(len(sentences), n_parts)
return [' '.join(sentences[i * k + min(i, m):(i + 1) * k + min(i + 1, m)]) for i in range(n_parts)]
from concurrent.futures import ProcessPoolExecutor, as_completed
def TextRank(text,num_sentences, n_cores=multiprocessing.cpu_count()):
start_time = time.time()
logging.info("TextRank 函数开始执行")
# text_parts = split_text_by_sentences(text, n_cores)
text_parts = split_text_balanced(text, n_cores)
all_keywords = []
all_summaries = []
# with ProcessPoolExecutor (max_workers=n_cores) as executor:
# future_to_part = {executor.submit(process_text_segment, part, num_sentences): part for part in text_parts}
# for future in as_completed(future_to_part):
# keywords, summaries = future.result()
# all_keywords.extend(keywords)
# all_summaries.extend(summaries)
for part in text_parts:
keywords, summaries = process_text_segment(part, num_sentences)
all_keywords.extend(keywords)
all_summaries.extend(summaries)
for word, weight in sorted(all_keywords, key=lambda x: x[1], reverse=True):
print(word, weight)
all_summaries = "".join(all_summaries)
end_time = time.time()
elapsed_time = end_time - start_time
logging.info(f"TextRank 函数执行结束,耗时: {elapsed_time:.2f}")
return all_summaries
if __name__ == '__main__':
# 传入必要的参数
num_sentences = 80
summary = TextRank(text, num_sentences)