繁体   English   中英

如何将输入文本拆分为相同大小的标记,而不是字符长度,然后连接 Hugging Face 转换器的摘要结果

[英]How to split input text into equal size of tokens, not character length, and then concatenate the summarization results for Hugging Face transformers

我正在使用以下方法来总结超过 1024 个令牌大小的长文本。

当前方法将文本分成两半。 我从另一个用户的帖子中获取并稍微修改了它。

所以我想做的是,不是分成两半,而是将整个文本分成 1024 个大小相等的标记,然后对每个标记进行摘要,然后在最后,将它们按正确的顺序连接起来并写入文件。 我如何进行标记化并获得正确的 output?

使用Split(" ")的文本与标记化不同。 它产生不同的计数。

import logging
from transformers import pipeline

f = open("TextFile1.txt", "r")

ARTICLE = f.read()

summarizer = pipeline("summarization", model="facebook/bart-large-cnn" )

counter = 1

def summarize_text(text: str, max_len: int) -> str:
    global counter
    try:
        #logging.warning("max_len " + str(max_len))
        summary = summarizer(text, min_length=30, do_sample=False)
        with open('parsed_'+str(counter)+'.txt', 'w') as f:
            f.write(text)
        counter += 1
        return summary[0]["summary_text"]
    except IndexError as ex:
        logging.warning("Sequence length too large for model, cutting text in half and calling again")
        return summarize_text(text=text[:(len(text) // 2)], max_len=max_len) + " " + summarize_text(text=text[(len(text) // 2):], max_len=max_len)

gg = summarize_text(ARTICLE, 1024)

with open('summarized.txt', 'w') as f:
    f.write(gg)

我喜欢使用 nltk 分割文本。 你也可以用 spacy 来做,质量更好,但需要更长的时间。 nltk 和 spacy 允许您将文本切割成句子,这更好,因为文本片段更连贯。 为了安全起见,您希望将其削减到小于 1024。 512 应该更好,它是原始 BERT 使用的,所以应该不会太差。 你只是在最后总结总结。 这是一个例子:

import nltk
from nltk.tokenize import sent_tokenize

def split_in_segments(text):
    tokens = 0
    mystring = list()
    segments = []
    for sent in sent_tokenize(text):
        newtokens = len(sent.split())
        tokens += newtokens
        mystring.append(str(sent).strip())
        if tokens > 512:
            segments.append(" ".join(mystring))
            mystring = []
            tokens = 0
    if mystring:
        segments.append(" ".join(mystring))
    return(segments)

def summarize_4_plotly(text):
    segments = split_in_segments(text)
    summarylist = summarizer(segments, max_length=100, min_length=30, do_sample=False)
    summary = summarizer(" ".join([summarylist[i]['summary_text'] for i in range(len(summarylist))]), max_length = 120, min_length = 30, do_sample = False)
    return(summary)

summarize_4_plotly(text)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM