Представьте, что вы готовитесь к важному тесту или экзамену, который требует запоминания словарного запаса; список важных слов. Что ты обычно делаешь? Ты открываешь список, смотришь на первое слово и его определение и начинаешь повторять его пару раз, и надеешься, что после пары повторений слово и его определение запомнились. Вы накрываете определение этого слова листом бумаги и пытаетесь вспомнить, что это было за определение. Вы убираете этот лист бумаги, видите определение слова и сравниваете его с определением, которое вы сказали.

Есть три возможности при сравнении двух определений:

  1. Оба определения абсолютно одинаковы, поскольку предложения совпадают точно один к одному.
  2. Оба определения относительно одинаковы, но предложения не обязательно полностью совпадают.
  3. Оба определения относительно не одинаковы, и вы не запомнили определение полностью.

В сценариях 1 и 2 вы делаете вывод, что запомнили первое слово, и переходите к следующему слову в списке, повторяя этот процесс для каждого слова в списке. В случае сценария 3 вам нужно вернуться и повторить тот же процесс, который вы прошли, пока не дойдете до сценария 1 или сценария 2, а затем перейти к следующему слову в списке.

Конечно, с каждым дополнительным словом в списке этот процесс становится менее эффективным и каждое запоминаемое слово занимает все больше и больше времени. Скажем, вам нужно запомнить список из более чем 1000 слов за несколько дней, вам потребуется довольно много времени, посвященного каждый день только для запоминания слов. Если только этот процесс можно упростить. Что ж, теперь это действительно стало проще благодаря использованию науки о данных.

РЕШЕНИЕ

Решение состоит в использовании процесса подобия текста, чтобы проверить, имеют ли два предложения одинаковое значение; они семантически похожи. Семантическое сходство выполняется с использованием трех следующих шагов для каждого слова:

  1. Текст каждого предложения в списке, а также текст предложения, введенный пользователем, преобразуется в встраивание слов с использованием предварительно обученной модели BERT.
  2. Вложения слов обоих предложений сравниваются на сходство с использованием метрики косинусного сходства.
  3. Если косинусное сходство выше порога 0,80, то предложения подобны, в противном случае — нет.

Как только будет установлено, что оба предложения действительно похожи, можно, таким образом, установить, что слово было ЗАПОМИНЕНО вами, тем самым избавив вас от необходимости проверять себя, запомнили ли вы это слово или нет, тем самым помогая вам ускорить запоминание слова. процесс.

РЕАЛИЗАЦИЯ

Для реализации мы собираемся создать программу, которая сначала читает список слов с определениями в формате .csv. Затем программа просматривает каждое слово и просит пользователя определить слово с помощью ввода с клавиатуры или аудиозаписи.

Если пользователю предлагается ввести определение с помощью клавиатуры, он просто набирает ответ слова. Программа использует BERT для создания вложений слов для обоих текстов; входной ответ и предопределенное определение, которое было прочитано ранее из файла .csv. Он проверяет сходство предложений, используя BERT и метрику сходства косинуса. Если метрика косинусного сходства выше 0,8, то предложения похожи, и слово запомнилось пользователем.

ИНТЕРЕСНАЯ ДОПОЛНИТЕЛЬНАЯ ФУНКЦИЯ — ТРАНСКРИПЦИЯ АУДИО с использованием Deepspeech

Если пользователю предлагается ввести определение с использованием звука, его просят записать ответ, который затем транскрибируется с использованием библиотеки Deepspeech. Транскрипция — это процесс преобразования звука в текст. Затем программа следует тому же процессу, чтобы определить, запомнило ли слово пользователь.

КОД

  1. Установите необходимые библиотеки
pip install sentence-transformers
pip install deepspeech
pip install pyaudio

2. Загрузите предварительно обученную аудиомодель Deepspeech и файл скорера с сайта Deepspeech здесь.

3. Создать функцию расшифровки аудио, которая запускает поток PortAudio для записи звука в кадрах с частотой 16000 Гц и частотой дискретизации 16 бит на выборку.

def transcribe_audio():
    
    from deepspeech import Model
    import numpy as np
    import os
    import wave
    import json
    import pyaudio
    import io


    chunk = 1024  # Record in chunks of 1024 samples
    sample_format = pyaudio.paInt16  # 16 bits per sample
    channels = 1
    fs = 16000  
    seconds = 15

    p = pyaudio.PyAudio()  # Create an interface to PortAudio

    print('Recording for {} seconds'.format(seconds))


    stream = p.open(format=sample_format,
                    channels=channels,
                    rate=fs,
                    frames_per_buffer=chunk,
                    input=True)

    frames = []  # Initialize array to store frames

    # Store data in chunks for 15 seconds
    for i in range(0, int(fs / chunk * seconds)):
        data = stream.read(chunk)
        frames.append(data)

    # Stop and close the stream 
    stream.stop_stream()
    stream.close()
    # Terminate the PortAudio interface
    p.terminate()

    print('Stopped.')

Далее мы сохраним записанный поток в формате файла wav. Поскольку мы не хотим хранить его и сохранять в виде файла в каталоге (например, record.wav), мы будем использовать библиотеку IO для хранения волнового файла только в памяти.

    # Save the recorded data as a WAV file but don't save it in storage
    # Use IO library to store the WAV file in temporary format
    container = io.BytesIO()
    wf = wave.open(container, 'wb')
    wf.setnchannels(channels)
    wf.setsampwidth(p.get_sample_size(sample_format))
    wf.setframerate(fs)
    wf.writeframes(b''.join(frames))
    wf.close()

    # Read the data up to this point
    container.seek(0)
    data_package = container.read()

Теперь, когда у нас есть записанный файл, мы импортируем предварительно обученную модель Deepspeech English и средство подсчета очков, которые мы загрузили ранее, чтобы выполнить транскрипцию и вернуть расшифровку в качестве вывода функции.

    #load the pre-trained deep speech model and scorer from the same directory (need to download from the DeepSpeech website)
    DEEPSPEECH_MODEL_DIR = 'deepspeech'
    MODEL_FILE_PATH = os.path.join(DEEPSPEECH_MODEL_DIR, 'deepspeech-0.9.3-models.pbmm')
    SCORER_FILE_PATH = os.path.join(DEEPSPEECH_MODEL_DIR, 'deepspeech-0.9.3-models.scorer')
    beam_width = 100
    lm_alpha = 0.93
    lm_beta = 1.18

    model = Model(MODEL_FILE_PATH)
    model.enableExternalScorer(SCORER_FILE_PATH)
    model.setScorerAlphaBeta(lm_alpha, lm_beta)
    model.setBeamWidth(beam_width)
    
    data = np.frombuffer(data_package, np.int16)
    #Perform transcription of audio wave file
    text = model.stt(data)
    return text

4. Создайте простую функцию, которая сравнивает семантическое сходство двух предложений, используя библиотеку преобразователей предложений и метрику косинусного сходства.

def cosine_similarity(text1, text2):
    #Use the sentence transformers like to load a pre-trained BERT model for text-vector embeddings
    from sentence_transformers import SentenceTransformer
    #Cosine similiarity method from sk-learn compares the vector embeddings for semantic similarity 
    from sklearn.metrics.pairwise import cosine_similarity
    model = SentenceTransformer('bert-base-nli-mean-tokens')
    sentence_embeddings = model.encode([text1,text2])
    similiarity=cosine_similarity([sentence_embeddings[0]], sentence_embeddings[1:])
    return similiarity

5. Объедините все это в функцию word_memorized

Программа просматривает список файлов .csv, содержащих пары слов и определений. Затем он проходит по списку, предлагая пользователю дать определение для каждого слова в списке (либо с помощью ввода с клавиатуры, либо с помощью звука). Если слово запоминается по разработанным критериям, программа переходит к следующему слову в списке. Если нет, программа упоминает незаученное слово и затем переходит к следующему слову. В конце концов, он печатает и сохраняет все не запомненные слова в том же формате. Затем пользователь возвращается, чтобы запомнить эти слова, и снова возвращается к этой программе, на этот раз используя незаученный список в качестве нового списка пар определений слов, чтобы программа повторяла его снова.

def word_memorized(df, name):
    from time import sleep
    from datetime import date
    #If cosine_similarity >= 0.80 -> word memorized
    #If cosine_similarity < 0.80 -> you need to revise this word
    name = str(name)
    today = str(date.today())
    memorized_words = []
    not_memorized_words = []
    for i in range(len(df)):
        word = df.iloc[i].word
        definition = df.iloc[i].definition
        try:
            import random
            choice=random.choice([1,2])
            if choice==1:
                answer_given = input('Write the definition for {}: '.format(word.upper()))
            else:
                print('Record the definition for {}:'.format(word.upper()))
                sleep(10)   
                answer_given = transcribe_audio()

            similiarity=cosine_similarity(definition, answer_given)
            similiarity_word = cosine_similarity(word, answer_given)
            if (similiarity>=0.8) or (similiarity_word>=0.8):
                print('Word {} memorized'.format(word.upper()))
                memorized_words.append(word)
            else:
                print('Word {} not memorized yet or properly \ncorrect definition: {}\nyour answer {}:\nscore:{}'.format(word.upper(), definition, answer_given.upper(), similiarity))
                not_memorized_words.append(word)
        except KeyboardInterrupt:
            print ('KeyboardInterrupt exception is caught')
    if len(not_memorized_words)!=0:
        df_not_memorized = df.loc[df.word.isin(not_memorized_words)]
        df_not_memorized.to_csv('{}-{}-not-memorized.csv'.format(name.lower(),today), index=False)
    if len(memorized_words)!=0:
        df_memorized = df.loc[df.word.isin(memorized_words)]
    return not_memorized_words

Пожалуйста, не стесняйтесь использовать эту программу, чтобы помочь вам в запоминании слов.

Спасибо за прочтение!

Гитхаб