Siri, пожалуйста, посмотрите мою часовую лекцию в университете и сделайте для меня резюме

Обобщение NLP-видео с помощью Watson и GPT

В этом проекте я исследовал возможности GPT2 (который имеет около 1 миллиарда параметров) и могу только представить себе мощь самого последнего GPT3, имеющего 175 миллиардов параметров !, который может записывать программные коды в художественные стихи. В этом проекте я использовал университетскую лекцию - Введение в статистическое обучение, подготовленную профессором Сильвией Салини (руководитель отдела науки о данных, Миланский университет), и заставил ИИ (IBM WATSON) просмотреть всю лекцию и записать ее для меня. Я обучил модель GPT 2, так что она может суммировать 500 строк текста, написанного Ватсоном, до 10 строк.

  • Я использовал IBM Watson, потому что он позволяет вам бесплатно использовать 500 минут речи для преобразования текста без указания информации о кредитной карте, в отличие от Google Cloud и Azure.
  • В модели GPT2 я сохранил вероятность низкой и высокий уровень использования словарного запаса, поэтому GPT2 не извлекает из себя новую информацию и не делает краткое содержание лекции совершенно неверным.
  • Я только что создал прототип, обучив модель только одной лекцией, но вы можете попробовать несколько лекций по конкретному предмету для лучшего изучения модели и словарного запаса соответственно,

1 Преобразование лекции в аудиофайл

!pip install -q ffmpeg
!mkdir lecture
!mkdir audiochunk
import ffmpeg
!ffmpeg -i "/content/drive/My Drive/Statistical Learning course Intro2.mp4" "/content/lecture/video1.wav"
view raw gistfile1.txt hosted with ❤ by GitHub

2 Заставить Уотсона смотреть лекцию и заниматься

IBM Watson имеет ограничения на количество файлов для преобразования речи в текст для бесплатных пользователей в зависимости от продолжительности и размера файла, поэтому я разделил аудиофайл лекции продолжительностью 1 час на 6 различных аудиофайлов.

!pip install -q pydub
import pydub
from pydub import AudioSegment
from pydub.utils import make_chunks
myaudio = AudioSegment.from_file("/content/lecture/video1.wav" , "wav")
chunk_length_ms = 480000
chunks = make_chunks(myaudio, chunk_length_ms) #Make chunks of one sec
#Export all of the individual chunks as wav files
for i, chunk in enumerate(chunks):
chunk_name = "/content/audiochunk/chunk{0}.wav".format(i)
chunk.export(chunk_name, format="wav")
view raw gistfile1.txt hosted with ❤ by GitHub

Учетные данные Watson API можно получить на cloud.ibm.com и преобразовать в текстовый ресурс.

!pip install -q ibm-watson
WATSON_API_KEY = '****'
WATSON_STT_URL = '****'
view raw gistfile1.txt hosted with ❤ by GitHub

Заставляя Watson прослушивать все 6 фрагментов аудио, которые я сделал и записать в текст,
я выбрал самую первую альтернативу, которая имеет самый высокий уровень достоверности для точности.

import os
from ibm_watson import SpeechToTextV1
from ibm_cloud_sdk_core.authenticators import IAMAuthenticator
authenticator = IAMAuthenticator(WATSON_API_KEY)
speech_to_text = SpeechToTextV1(authenticator=authenticator)
speech_to_text.set_service_url(WATSON_STT_URL)
with open("/content/audiochunk/chunk0.wav", 'rb') as audio_file:
response0 = speech_to_text.recognize(
audio=audio_file,
content_type='audio/{}'.format(os.path.splitext("/content/audiosplit/video1.wav")[1][1:]),
model='en-US' + '_BroadbandModel',
max_alternatives=1,
).get_result()
with open("/content/audiochunk/chunk1.wav", 'rb') as audio_file:
response1 = speech_to_text.recognize(
audio=audio_file,
content_type='audio/{}'.format(os.path.splitext("/content/audiosplit/video1.wav")[1][1:]),
model='en-US' + '_BroadbandModel',
max_alternatives=1,
).get_result()
with open("/content/audiochunk/chunk2.wav", 'rb') as audio_file:
response2 = speech_to_text.recognize(
audio=audio_file,
content_type='audio/{}'.format(os.path.splitext("/content/audiosplit/video1.wav")[1][1:]),
model='en-US' + '_BroadbandModel',
max_alternatives=1,
).get_result()
with open("/content/audiochunk/chunk3.wav", 'rb') as audio_file:
response3 = speech_to_text.recognize(
audio=audio_file,
content_type='audio/{}'.format(os.path.splitext("/content/audiosplit/video1.wav")[1][1:]),
model='en-US' + '_BroadbandModel',
max_alternatives=1,
).get_result()
with open("/content/audiochunk/chunk4.wav", 'rb') as audio_file:
response4 = speech_to_text.recognize(
audio=audio_file,
content_type='audio/{}'.format(os.path.splitext("/content/audiosplit/video1.wav")[1][1:]),
model='en-US' + '_BroadbandModel',
max_alternatives=1,
).get_result()
with open("/content/audiochunk/chunk5.wav", 'rb') as audio_file:
response5 = speech_to_text.recognize(
audio=audio_file,
content_type='audio/{}'.format(os.path.splitext("/content/audiosplit/video1.wav")[1][1:]),
model='en-US' + '_BroadbandModel',
max_alternatives=1,
).get_result()
view raw gistfile1.txt hosted with ❤ by GitHub

Запись результатов в текстовый файл и объединение результатов из всех Аудио в один текстовый файл с именем lecture.txt

import json
with open('lecture0.json', 'w') as f:
json.dump(response0, f, indent=2)
with open('lecture1.json', 'w') as f:
json.dump(response1, f, indent=2)
with open('lecture2.json', 'w') as f:
json.dump(response2, f, indent=2)
with open('lecture3.json', 'w') as f:
json.dump(response3, f, indent=2)
with open('lecture4.json', 'w') as f:
json.dump(response4, f, indent=2)
with open('lecture5.json', 'w') as f:
json.dump(response5, f, indent=2)
with open('lecture0.json','r+') as file:
lecturedic = json.load(file)
for item in lecturedic['results']:
print(item['alternatives'][0]['transcript'] +'.',file=open("lecture0.txt", "a"))
with open('lecture1.json','r+') as file:
lecturedic = json.load(file)
for item in lecturedic['results']:
print(item['alternatives'][0]['transcript'] +'.',file=open("lecture1.txt", "a"))
with open('lecture2.json','r+') as file:
lecturedic = json.load(file)
for item in lecturedic['results']:
print(item['alternatives'][0]['transcript'] +'.',file=open("lecture2.txt", "a"))
with open('lecture3.json','r+') as file:
lecturedic = json.load(file)
for item in lecturedic['results']:
print(item['alternatives'][0]['transcript'] +'.',file=open("lecture3.txt", "a"))
with open('lecture4.json','r+') as file:
lecturedic = json.load(file)
for item in lecturedic['results']:
print(item['alternatives'][0]['transcript'] +'.',file=open("lecture4.txt", "a"))
with open('lecture5.json','r+') as file:
lecturedic = json.load(file)
for item in lecturedic['results']:
print(item['alternatives'][0]['transcript'] +'.',file=open("lecture5.txt", "a"))
filenames = ['lecture0.txt', 'lecture1.txt','lecture2.txt','lecture3.txt','lecture4.txt','lecture5.txt']
with open('lecture.txt', 'w') as outfile:
for fname in filenames:
with open(fname) as infile:
for line in infile:
outfile.write(line)
view raw gistfile1.txt hosted with ❤ by GitHub

Настройка модели 3 GPT 2

GPT 2 - это причинно-следственная генерация текста, предварительно обученная модель из открытого ИИ, которая работает с предсказанием.

GPT-2 генерирует образцы синтетического текста в ответ на произвольный ввод модели. Модель похожа на хамелеона - она ​​адаптируется к стилю и содержанию условного текста. Это позволяет пользователю создавать реалистичные и последовательные продолжения по теме по своему выбору - https://openai.com/blog/better-language-models/

!pip install -q gpt2
!pip install -q git+git://github.com/huggingface/transformers/
!wget https://raw.githubusercontent.com/huggingface/transformers/master/examples/language-modeling/run_language_modeling.py
!mkdir output
!mkdir cache1
#tuning and training model at 100 epochs
!python run_language_modeling.py --cache_dir=/content/cache1 --output_dir=/content/output --model_type=gpt2 --model_name_or_path=gpt2 --do_train --train_data_file=/content/lecture.txt --per_gpu_train_batch_size=1 --num_train_epochs=100
view raw gistfile1.txt hosted with ❤ by GitHub

4 Резюме лекции

from transformers import GPT2Tokenizer, GPT2LMHeadModel
import torch
import numpy as np
OUTPUT_DIR = "/content/output"
device = 'cpu'
if torch.cuda.is_available():
device = 'cuda'
tokenizer = GPT2Tokenizer.from_pretrained(OUTPUT_DIR)
model = GPT2LMHeadModel.from_pretrained(OUTPUT_DIR)
model = model.to(device)
def lecsum(input_str, length=200, n=5000):
ids = torch.tensor(tokenizer.encode(input_str)).unsqueeze(0).long().to(device)
model.eval()
with torch.no_grad():
for i in range(length):
outputs = model(ids[:, -1024:], labels=ids[:, -1024:])
loss, logits = outputs[:2]
softmax_logits = torch.softmax(logits[0,-1], dim=0)
next_token_id = choose_from_top(softmax_logits.to('cpu').numpy(), n=n)
ids = torch.cat([ids, torch.ones((1,1)).long().to(device) * next_token_id], dim=1)
output_list = list(ids.squeeze().to('cpu').numpy())
lecsum = tokenizer.decode(output_list)
return lecsum
def choose_from_top(probs, n=5):
ind = np.argpartition(probs, -n)[-n:]
top_prob = probs[ind]
top_prob = top_prob / np.sum(top_prob) # Normalize
choice = np.random.choice(n, 1, p = top_prob)
token_id = ind[choice][0]
return int(token_id)
lecturegen = lecsum(" Lecture Summary \n")
print(lecturegen)
view raw gistfile1.txt hosted with ❤ by GitHub

Результаты

Хотя мощность модели GPT2 весьма впечатляет, мы все же не можем полагаться на неопровержимые факты с GPT2, хотя я считаю, что она более точна и требует меньше времени, когда у вас меньше ресурсов для инвестирования в NLP, например, предварительно обученные модели. такие как GPT 2 или RoBERTa, очевидно, будут работать лучше, чем один человек, выполняющий встраивание слов и тренирующий модель NLP в течение недели. Итак, GPT2 хорош для начала или представления экспериментального проекта, такого как чат-боты или говорящие веб-сайты, но для более профессионального использования необходимо потратить хорошие ресурсы на индивидуальную модель НЛП в соответствии с вашими потребностями.

Для полной записной книжки и кода jupyter вы можете просмотреть мой репозиторий на github.com - https://github.com/Alexamannn/NLP-Video-Summarization-with-Watson-and-GPT