3个版本
0.0.3 | 2023年12月15日 |
---|---|
0.0.2 | 2023年11月19日 |
0.0.1 | 2023年11月13日 |
#312 在 文本处理
每月22次下载
25KB
236 行
Rust中的TF-IDF文本摘要
实现了一种基于文本中词的TF-IDF分数的抽取式文本摘要系统,用于对句子进行排序并生成摘要
[!注意] 请阅读 TowardsDataScience上的博客
内容
使用
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
生成)将帮助我们使用summarize
和par_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软件包,该软件包在用户系统上安装后将执行以下任务,
- 将
libsummarizer.a
复制到/usr/local/lib/
- 将
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-v7a
和arm64
架构的共享库。安装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