自然语言处理(NLP)是当前科技领域中发展最快的领域之一。从消息垃圾邮件过滤器到使用聊天机器人进行医疗诊断,NLP技术无处不在。目前NLP的一些热门应用包括文本摘要、聊天机器人、机器翻译和文本生成等。
是否曾想象过,在观看YouTube教程或视频之前,能够快速阅读一个简短的视频摘要,这无疑会帮助节省大量时间,通过快速理解或摘要在短时间内了解视频内容。本文将讨论一个小型NLP项目——YouTube摘要器,它将对YouTube视频的内容(字幕)进行摘要。对于许多视频来说,视频的主要内容只占总长度的50-60%,因此YouTube摘要器将通过保留所有重要点并使内容简短且易于理解来摘要视频内容。这将有助于轻松获取多个讲座视频的摘要。
首先,来讨论什么是摘要。摘要是一种技术,它能够在不遗漏文章重要内容的情况下,为给定的大型文本文档制作简短、易懂的笔记。NLP中有两种类型的摘要:提取式摘要和抽象式摘要。
在提取式摘要中,系统将从给定的段落中提取重要段落和内容,并将这些提取的段落组合起来创建摘要文本。在抽象式摘要中,系统将基于给定的段落用自己的话创建摘要。这比提取式摘要更复杂。
对于YouTube摘要器,使用的是提取式摘要。在提取式摘要中,使用不同的摘要技术,如使用BART或双向自回归变换器,使用TFIDF向量化器等。
YouTube摘要器的基本结构是,使用Python模块Youtube-Transcript-API下载所提供YouTube视频的字幕,然后执行文本预处理技术,最后进行不同的摘要算法以摘要给定的文本。
首先,导入所有所需的库:
import youtube_transcript_api
from youtube_transcript_api import YouTubeTranscriptApi
import nltk
import re
from nltk.corpus import stopwords
import sklearn
from sklearn.feature_extraction.text import TfidfVectorizer
第一步是获取要摘要视频的字幕。为此,使用Python的youtube_transcript_api模块。对于每个YouTube视频,都有一个唯一的ID。例如,假设视频的YouTube链接是”https://www.youtube.com/watch?v=WB-y7_yMPj4",唯一的ID将是”WB-y7_yMPj4"。使用这个唯一的ID来获取字幕。
link = "https://www.youtube.com/watch?v=Y8Tko2YC5hA"
unique_id = link.split("=")[-1]
sub = YouTubeTranscriptApi.get_transcript(unique_id)
subtitle = " ".join([x['text'] for x in sub])
使用youtube_transcript_api下载了字幕。正如之前讨论的,本文将讨论两种不同的文本摘要算法,即使用TF-IDF向量化器和使用BART。
首先,讨论使用TF-IDF向量化器进行摘要。TF-IDF或词频-逆文档频率是一种向量化器,它将文本转换为向量。它有两个术语:词频和逆文档频率。TF-IDF值是这两个术语的乘积。词频是句子中单词重复次数除以该句子中单词总数。逆文档频率是句子数的对数除以包含给定单词的句子数。让开始实现。
from nltk.tokenize import sent_tokenize
使用nltk库的句子_tokenizer进行标记化。
subtitle = subtitle.replace("n","")
sentences = sent_tokenize(subtitle)
现在将标记化的句子组织成字典,以句子为键,相应的索引为其值。
organized_sent = {k:v for v,k in enumerate(sentences)}
接下来,使用tf-idf向量化器,借助它将得到在标记化期间创建的每个句子的分数。
tf_idf = TfidfVectorizer(min_df=2,
strip_accents='unicode',
max_features=None,
lowercase = True,
token_pattern=r'w{1,}',
ngram_range=(1, 3),
use_idf=1,
smooth_idf=1,
sublinear_tf=1,
stop_words = 'english')
sentence_vectors = tf_idf.fit_transform(sentences)
sent_scores = np.array(sentence_vectors.sum(axis=1)).ravel()
现在让找出得分最高的N个句子。
N = 3
top_n_sentences = [sentences[index] for index in np.argsort(sent_scores, axis=0)[::-1][:N]]
现在让根据字幕中的顺序对顶级句子进行排序。
# mapping the scored sentences with their indexes as in the subtitle
mapped_sentences = [(sentence,organized_sent[sentence]) for sentence in top_n_sentences]
# Ordering the top-n sentences in their original order
mapped_sentences = sorted(mapped_sentences, key = lambda x: x[1])
ordered_sentences = [element[0] for element in mapped_sentences]
# joining the ordered sentence
summary = " ".join(ordered_sentences)
BART(双向自回归变换器)是一种变换器,现在通常用于序列到序列问题。其架构主要包括一个双向编码器和一个从左到右的解码器。BART适用于摘要、机器翻译、问答等。
让开始实现。首先,安装transformers。
!pip install transformers
让导入必要的库。
import transformers
from transformers import BartTokenizer, BartForConditionalGeneration
现在让导入Bart预训练的标记器和Bart预训练的模型进行摘要。
tokenizer = BartTokenizer.from_pretrained('facebook/bart-large-cnn')
model = BartForConditionalGeneration.from_pretrained('facebook/bart-large-cnn')
在文章的第一部分下载了字幕。让使用Bart Tokenizer对这段字幕进行编码。
input_tensor = tokenizer.encode( subtitle, return_tensors="pt", max_length=512)
现在让使用Bart摘要模型生成输出摘要。
outputs_tensor = model.generate(input_tensor, max_length=160, min_length=120, length_penalty=2.0, num_beams=4, early_stopping=True)
输出将是一个张量,为了从中获取文本,需要使用相同的Bart Tokenizer模型进行解码。
print(tokenizer.decode(outputs_tensor[0]))
使用BART进行摘要将比TF-IDF向量化器摘要获得更好的结果。也可以对BART进行微调以获得更好的结果。
此外,让尝试使用transformers的摘要管道进行摘要。
from transformers import pipeline
summarizer = pipeline('summarization')
summary = summarizer(subtitle, max_length = 180, min_length = 30)
这是一个使用transformers的摘要模型的低级或基本实现。与BART类似,还有distilbart、BERT、GPT-2等,它们将为提供准确的摘要。
总的来说,YouTube摘要器将为提供视频的简短摘要,这将有助于节省大量时间(注意,它适用于有字幕的视频)。希望喜欢这篇文章和这个小型NLP项目。可以在接下来的文章中讨论有趣的NLP项目。