USER
Нужна функция, которая будет на вход принимать список событий [{"type": "start", "timestamp": 1707064621, "offset": 2221}, {"type": "end", "timestamp": 1707065063, "offset": 2663}] и список слов [{"word": "Доброе", "start": 1.527, "end": 2.811, "score": 0.0, "speaker": "SPEAKER_00"}, {"word": "утро!", "start": 2.911, "end": 3.111, "score": 0.002, "speaker": "SPEAKER_00"}, {"word": "Вот", "start": 21.493, "end": 21.573, "score": 0.001, "speaker": "SPEAKER_00"}]
Для каждого события нужно определить:
1. Если type = start: нужно получить два полных предложения после метки offset
2. Если type = end: нужно получить два полных предложения до метки offset
Вернуть нужно список кортежей (type, два предложения)ASSISTANT
Чтобы реализовать функцию, выполняющую описанные действия, необходимо сначала объединить слова в текст, затем разделить его на предложения и найти подходящие сегменты в соответствии с метками `offset` от событий типа `start` или `end`. Нужно иметь в виду, что разделение на предложения может быть нетривиальной задачей, зависящей от языка и конкретных правил разделения текста на предложения. Для примера, приведем более простую версию, которая будет использовать обычные знаки препинания (точка, восклицательный и вопросительный знаки) для определения предложений:
```python
import re
def find_sentences(words, start_offset=None, end_offset=None, is_start=True):
# Объединяем слова в текст
text = ' '.join([word['word'] for word in words])
# Разделяем текст на предложения
sentences = re.split(r'[.!?]\s*', text)
# Переводим offset из секунд в индекс слова, исходя из временных меток
if is_start:
word_index = next(i for i, word in enumerate(words) if word['start'] > start_offset)
# Берем два полных предложения после start_offset
return ' '.join(sentences[word_index:word_index+2])
else:
word_index = next((i for i, word in enumerate(words) if word['end'] > end_offset), len(words) - 1)
# Берем два полных предложения до end_offset
return ' '.join(sentences[max(0, word_index-2):word_index])
def extract_sentences(events, words):
results = []
for event in events:
if event['type'] == 'start':
sentences = find_sentences(words, start_offset=event['offset'], is_start=True)
results.append((event['type'], sentences))
elif event['type'] == 'end':
sentences = find_sentences(words, end_offset=event['offset'], is_start=False)
results.append((event['type'], sentences))
return results
# Примеры данных
events = [
{"type": "start", "timestamp": 1707064621, "offset": 2221},
{"type": "end", "timestamp": 1707065063, "offset": 2663}
]
words = [
{"word": "Доброе", "start": 1.527, "end": 2.811, "score": 0.0, "speaker": "SPEAKER_00"},
{"word": "утро!", "start": 2.911, "end": 3.111, "score": 0.002, "speaker": "SPEAKER_00"},
{"word": "Вот", "start": 21.493, "end": 21.573, "score": 0.001, "speaker": "SPEAKER_00"}
]
# Вызов функции и вывод результата
results = extract_sentences(events, words)
for r in results:
print(r)
```
Обратите внимание:
- Приведенная функция `find_sentences` пытается определить индекс слова, которое следует за событием `start` или перед событием `end`, и затем извлекать два полных предложения.
- Относительно простое правило используется для разбиения текста на предложения с помощью регулярных выражений `re.split(r'[.!?]\s*', text)`, которое может не учитывать все нюансы естественного языка.
- Реальный алгоритм может потребовать более сложной логики и использование NLP библиотек, таких как `nltk` в Python, для более точного разделения текста на предложения.
Важно отметить, что в данных, предоставленных в примере, нет полноценных предложений и временных меток в секундах, поэтому функция `find_sentences` может работать некорректно с такими данными. Вам будет необходимо адаптировать данную функцию под вашу конкретную задачу и предоставить адекватные входные данные для корректной работы.