当前位置: 首页 > news >正文

基于sklearn实现文本摘要思考

和各位小伙伴分享一下使用sklearn进行文本摘要的思考。

第一版本

原理

提取式文本摘要的基本原理是:

  1. 将文本分割成句子

  2. 计算每个句子的重要性(权重)

  3. 选择权重最高的几个句子组成摘要

常用的句子权重计算方法:

  • TF-IDF:基于词频-逆文档频率

  • 文本相似度:计算句子与全文的相似度

  • 句子位置:考虑句子在文中的位置(开头/结尾通常更重要)

  • 句子长度:适中的句子长度可能更重要

代码实现

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
import nltk
from nltk.tokenize import sent_tokenize
​
nltk.download('punkt')
​
class SklearnSummarizer:
    def __init__(self, language='english'):
        self.language = language
    
    def summarize(self, text, num_sentences=3):
        """
        基于TF-IDF和余弦相似度的文本摘要
        
        参数:
            text: 要摘要的文本
            num_sentences: 摘要中包含的句子数量
            
        返回:
            摘要文本
        """
        # 分割句子
        sentences = sent_tokenize(text, self.language)
        
        if len(sentences) <= num_sentences:
            return text
            
        # 计算TF-IDF矩阵
        tfidf = TfidfVectorizer(stop_words=self.language)
        tfidf_matrix = tfidf.fit_transform(sentences)
        
        # 计算句子相似度矩阵
        sim_matrix = cosine_similarity(tfidf_matrix, tfidf_matrix)
        
        # 计算句子重要性得分(与所有其他句子的平均相似度)
        scores = np.zeros(len(sentences))
        for i in range(len(sentences)):
            scores[i] = sim_matrix[i].mean()
        
        # 获取得分最高的句子索引
        top_sentence_indices = scores.argsort()[-num_sentences:][::-1]
        top_sentence_indices.sort()  # 保持原文顺序
        
        # 生成摘要
        summary = ' '.join([sentences[i] for i in top_sentence_indices])
        return summary
​
# 使用示例
if __name__ == "__main__":
    text = """
    Natural language processing (NLP) is a subfield of linguistics, computer science, 
    and artificial intelligence concerned with the interactions between computers and human language. 
    It focuses on how to program computers to process and analyze large amounts of natural language data. 
    The result is a computer capable of "understanding" the contents of documents, including the contextual 
    nuances of the language within them. The technology can then accurately extract information and insights 
    contained in the documents as well as categorize and organize the documents themselves. 
    Challenges in natural language processing frequently involve speech recognition, natural language understanding, 
    and natural language generation.
    """
    
    summarizer = SklearnSummarizer()
    summary = summarizer.summarize(text, num_sentences=2)
    print("摘要结果:")
    print(summary)

优化

  1. 加入句子位置特征

    # 在计算得分时加入位置权重
    position_weights = [1/(i+1) for i in range(len(sentences))]  # 前面的句子权重更高
    scores = scores * position_weights
  2. 加入句子长度特征

    # 过滤掉过短或过长的句子
    avg_length = np.mean([len(s.split()) for s in sentences])
    length_weights = [1 - abs(len(s.split())-avg_length)/avg_length for s in sentences]
    scores = scores * length_weights
  3. 使用更复杂的特征

    • 命名实体数量

    • 包含数字或特定关键词

    • 句子与标题的相似度

第二版本

第一个版本还是有点问题的:

  • 只是简单提取句子,无法生成新句子

  • 对长文档效果可能不佳

  • 依赖句子分割质量

所以后续又采用Transfromaer进行了重新思考和编写,后续再分享吧。嘿嘿嘿

http://www.dtcms.com/a/113201.html

相关文章:

  • Linux进程间通信——有名管道
  • 【AI论文】基础智能体(Foundation Agents)领域的进展与挑战:从类脑智能到进化型、协作型及安全型系统
  • 数据化管理(二)---寻找零售密码
  • 使用Ubuntu18恢复群晖nas硬盘数据外接usb
  • [自制调试工具]利用模板函数打造通用调试工具
  • 使用OpenFeign实现服务远程调用
  • 数据定义语言
  • 【速写】einops杂记
  • 【数据结构】堆
  • 【KWDB创作者计划】_KaiwuDB 2.1.0 单节点裸机部署
  • 续-算法-数学知识
  • 数据结构【栈和队列附顺序表应用算法】
  • GenerationMixin:generate
  • MIPI与DVP接口摄像头:深度解析与应用指南
  • 素数的判断方法
  • Mysql explain中列的解析
  • SortedSet结构之用户积分实时榜单实战
  • WordPress图标设置插件,免费功能小巧
  • 武装自己的Kali
  • 轨道交通装备三维检测与轻量化设计
  • Cookie、Session、Token、JWT的区别和使用场景
  • 深度测评 | 聚铭下一代智慧安全运营中心如何破解电力行业安全运维难题?
  • C++ 判断字符是否为数字或字母:isalpha、isdigit 和 isalnum 函数详解
  • 【2-8】同步通信与异步通信
  • 数据库性能优化(sql优化)_子查询02_yxy
  • 二十种中药果实识别分类系统,Python/resnet18/pytorch
  • C++_类和对象(下)
  • 无状态版的DHCPv6是不是SLAAC? 笔记250405
  • 【LeetCode Solutions】LeetCode 146 ~ 150 题解
  • JVM深入原理(六)(二):双亲委派机制