#nlp #tf-idf #text-summarization

tfidf-text-summarizer

实现了一种基于文本中词的TF-IDF分数的抽取式文本摘要系统,用于对句子进行排序并生成摘要

3个版本

0.0.3 2023年12月15日
0.0.2 2023年11月19日
0.0.1 2023年11月13日

#312文本处理

每月22次下载

自定义许可

25KB
236

project-banner

Rust中的TF-IDF文本摘要

tfidf-text-summarizer crate tfidf-text-summarizer documentation

实现了一种基于文本中词的TF-IDF分数的抽取式文本摘要系统,用于对句子进行排序并生成摘要

[!注意] 请阅读 TowardsDataScience上的博客

内容

  1. 使用
    1. Rust中使用
    2. C/C++和Debian软件包中的使用
    3. Android中使用
  2. 贡献
  3. 有用的外部资源

使用

Rust中使用

编译此项目需要Rust的nightly版本(该项目依赖项punkt需要),可以通过rustup添加

$> rustup toolchain install nightly
$> cargo new <crate-name>
$> cd <crate-name>
$> crate-name> rustup override set nightly

您可以查看官方指南覆盖

在项目的Cargo.toml中添加依赖项tfidf-text-summarizer = "0.0.1"

[package]
...

[dependencies]
tfidf-text-summarizer = "0.0.1"

和执行以下命令:

该库提供了两个函数来从给定的文本中提取摘要。这两个函数都接受两个参数作为输入:

text: &str - 需要生成摘要的文档的文本。

  • reduction_factor: f32 - 生成摘要中包含的句子数量的相对比例。

  • tfidf-text-summarizer::par_summarize:它与summarize类似,但使用Rayon来并行化摘要流程中的某些操作。对于较长的文本,par_summarize在多核系统上优于summarize

use summarizer::{summarize,par_summarize} ; 
use std::fs as fs ; 

fn main() {
    let text: String = fs::read_to_string( "wiki.txt" )
                            .expect( "Could not read wiki.txt" ) ;
    let reduction_factor: f32 = 0.4 ; 

    // Use summarize of par_summarize here
    let summary: String = summarize( text.as_str() , reduction_factor ) ; 
    
    println!( "Summary is {}" , summary ) ;
}

与C/C++代码库以及Debian软件包的用法

使用GCC构建可执行文件

可以通过在Cargo.toml中设置crate_type = [ "staticlib" ]来生成静态库。库(.a存档)以及C头文件(使用cbindgen生成)将帮助我们使用summarizepar_summarize方法在C/C++项目中。

在C代码中使用summarize方法(查看examples/c以获取完整示例)

#include "summarizer.h"
#include <stdlib.h>
#include <stdio.h>

int main( int argc , char** argv ) {
    char* filename = argv[ 1 ] ; 
    FILE* file_ptr = fopen( filename , "r" ) ;
    fseek( file_ptr , 0 , SEEK_END ) ; 
    long size = ftell( file_ptr ) ; 
    fseek( file_ptr , 0 , SEEK_SET ) ; 
    char* buffer = (char*) calloc( size , sizeof(char) );  
    fread( buffer , sizeof( char ) , size , file_ptr ) ;
    fclose( file_ptr ) ;
    const char* summarized_text = (char*) summarize( buffer , size , 0.5f ) ;
    printf( "%s \n" , summarized_text ) ;
    return 0 ;
}

构建Debian软件包

按照使用C/C++中的静态库中提到的步骤,我们可以将C头文件summarizer.h和静态库复制到debian目录中,

$> cp target/x86_64-unknown-linux-gnu/release/libsummarizer.a debian/summarizer/
$> cp examples/c/summarizer.h debian/summarizer/
A. 打包头文件和库

现在我们可以构建一个Debian软件包,该软件包在用户系统上安装后将执行以下任务,

  1. libsummarizer.a复制到/usr/local/lib/
  2. summarizer.h复制到/usr/include/

这两个步骤是通过debian/summarizer/DEBIAN/中的postinst脚本完成的

#!/bin/bash
cp ../libsummarizer.so /usr/local/lib/
cp ../summarizer.h /usr/include/

同一目录中的control脚本提供了有关软件包的信息,

Package: Summarizer
Version: 0.0.1
Maintainer: Shubham Panchal
Architecture: amd64
Description: A text summarizer based on TF-IDF

要使用dpkg-deb实用程序构建软件包并将其重命名,我们可以编写一个简单的Bash脚本build_package.sh

#!/bin/bash
dpkg-deb --build summarizer
mkdir -p packages
mv summarizer.deb packages/summarizer-v0.0.1-amd64.deb

要构建软件包,请执行build_package.sh

$> cd debian
$ debian> bash build_package.sh 

debian/packages目录中将生成软件包summarizer-v0.0.1-amd64.deb

安装Debian软件包

要安装Debian软件包,请使用dpkg实用程序,

$> sudo dpkg -i summarizer-v0.0.1-amd64.deb

Android中使用

我们可以将Rust代码编译为目标为armeabi-v7aarm64架构的共享库。安装Android NDK软件包和必要的工具链后,我们可以编译.so库。有关JNI函数的详细信息,请参阅src/lib.rs中的android模块。

有关更多信息,请参阅examples/android/README.md

贡献

项目可以从以下方面进行改进(摘自博客)

  • 当前实现需要Rust的夜间构建版本,这仅因为一个依赖项punkt。punkt是一个句子分词器,它用于确定文本中的句子边界,之后进行其他计算。如果punkt可以使用稳定版本的Rust构建,则当前实现将不再需要夜间Rust。

  • 向句子排名中添加更新的指标,特别是捕捉句子之间依赖关系的指标。TFIDF并不是最准确的评分函数,它也有自己的局限性。构建句子图并用于评分句子,极大地提高了提取摘要的整体质量。

  • 摘要生成器尚未与已知数据集进行基准测试。Rouge评分R1、R2和RL常用于评估生成摘要与标准数据集(如纽约时报数据集或CNN Daily mail数据集)的质量。与标准基准的测量将提供给开发者更多清晰性和可靠性。

  • examples/python中完成Python实现。

有用的外部资源

依赖项

~11–22MB
~156K SLoC