Skip to content

Алгоритм взвешенной оценци значимого слайда v1.0

Alexander Davydov edited this page Feb 23, 2021 · 4 revisions

Определение значимого слайда

Значимым слайдом на данный момент принято считать сдайд с заголовком "Цели и Задачи"

Алгоритм взвешенной оценки слайда

Source:

def get_weight_scale(slide_text, transcript_text):
    '''Мы получаем частоту слов для обоих параметров, затем, в зависимости
    от совпадающих слов и их частот начисляем коэффициент, на который будут
    умножены результаты функции weight_cmp

    :param text1:
    :param text2:
    :return:
    '''
    slide_tokens1 = word_tokenize(slide_text)
    transcript_tokens2 = word_tokenize(transcript_text)
    tokenized_slide = Text(slide_tokens1)
    tokenized_transcript = Text(transcript_tokens2)
    slide_freq = FreqDist(tokenized_slide)
    transcript_freq = FreqDist(tokenized_transcript)

    slide_words = slide_freq.keys()
    transcript_words = transcript_freq.keys()

    n = len(transcript_words)
    k = 0
    count_value_words = 0

    for w in transcript_words:
        if w in slide_words:
            w_slide_freq = slide_freq[w]
            w_transcript_freq = min(transcript_freq[w], w_slide_freq)
            if w_slide_freq > 1:
                count_value_words += 1
                k += w_transcript_freq / n
                print("Слово: [%s]" % w)
                print('Trancript Freq:', transcript_freq[w])
                print('Slide Freq:', slide_freq[w])
                print('WEIGHT:', w_transcript_freq / n)
                print("Промежуточный аддитивный WEIGHT коэф. k =", k)
    print("Результирующий весовой коэффициент:", 1 + k/count_value_words)
    return (1 + k / count_value_words)


def weight_cmp(s1, s2, force_ascii=True, full_process=True):
    '''За основу взята функция fuzzywuzzy.fuzz.WRatio
    Ниже представлена моификация этой функции с учетом весого коэффициента

    :param text1:
    :param text2:
    :return:
    '''
    from fuzzywuzzy.fuzz import ratio, partial_ratio, partial_token_sort_ratio, \
        partial_token_set_ratio, token_sort_ratio, token_set_ratio
    from fuzzywuzzy import utils

    if full_process:
        p1 = utils.full_process(s1, force_ascii=force_ascii)
        p2 = utils.full_process(s2, force_ascii=force_ascii)
    else:
        p1 = s1
        p2 = s2

    if not utils.validate_string(p1):
        return 0
    if not utils.validate_string(p2):
        return 0

    # should we look at partials?
    try_partial = True
    unbase_scale = .95
    partial_scale = .90
    weight_scale = get_weight_scale(p1, p2) # Additional

    base = ratio(p1, p2)
    len_ratio = float(max(len(p1), len(p2))) / min(len(p1), len(p2))

    # if strings are similar length, don't use partials
    if len_ratio < 1.5:
        try_partial = False

    # if one string is much much shorter than the other
    if len_ratio > 8:
        partial_scale = .6

    if try_partial:
        partial = partial_ratio(p1, p2) * partial_scale
        ptsor = partial_token_sort_ratio(p1, p2, full_process=False) \
                * unbase_scale * partial_scale
        ptser = partial_token_set_ratio(p1, p2, full_process=False) \
                * unbase_scale * partial_scale
        res = utils.intr(max(base, partial, ptsor, ptser)) * weight_scale
        if res > 100:
            return 100
        return res
    else:
        tsor = token_sort_ratio(p1, p2, full_process=False) * unbase_scale
        tser = token_set_ratio(p1, p2, full_process=False) * unbase_scale
        res = utils.intr(max(base, tsor, tser)) * weight_scale
        if res > 100:
            return 100
        return res
  1. Для сравнения транскрипции доклада с текстом на слайде используется функция функция fuzzywuzzy.fuzz.WRatio, модифицированная весовыми коэффициентами
  2. Весовой коэффициент считается в зависимости от частоты употребления слова на слайде

Рассмотрим подробности получения весового коэффициента:

Текст разбивается на токены, затем мы считаем словари частот для slide_text и transcript_text

    slide_tokens1 = word_tokenize(slide_text)
    transcript_tokens2 = word_tokenize(transcript_text)
    tokenized_slide = Text(slide_tokens1)
    tokenized_transcript = Text(transcript_tokens2)
    slide_freq = FreqDist(tokenized_slide)
    transcript_freq = FreqDist(tokenized_transcript)

Если слово из slide_text присутствует в transcript_text, тога мы берем максимальную частоту встречаемости этого слова в этих словарях. Затем эта частота встречаемости делится на длину частотного словаря для транскрипта n и добавляется к коэффициенту k, который мы называем промежуточным весовым коэффициентом. Попутно мы также считаем количество значимых слов, инкрементируя переменную count_value_words на каждом цикле иттерации,когда слово есть в обоих частотных словарях.

    n = len(transcript_words)
    k = 0
    count_value_words = 0

    for w in transcript_words:
        if w in slide_words:
            w_slide_freq = slide_freq[w]
            w_transcript_freq = min(transcript_freq[w], w_slide_freq)
            if w_slide_freq > 1:
                count_value_words += 1
                k += w_transcript_freq / n
                print("Слово: [%s]" % w)
                print('Trancript Freq:', transcript_freq[w])
                print('Slide Freq:', slide_freq[w])
                print('WEIGHT:', w_transcript_freq / n)
                print("Промежуточный аддитивный WEIGHT коэф. k =", k)
    print("Результирующий весовой коэффициент:", 1 + k/count_value_words)
    return (1 + k / count_value_words)

В итоге в k собирается суммарный вес значимых слов на слайде. Итоговый весовой коэффициент считается по формуле 1 + k / count_value_words

Идея этой формулы в том, что мы получаем весовой коэффициент в диапазоне 1 < weight_k < M/(n * count_value_words) < 2. M - это сумма максимальных частот для слов, которые есть в обоих частотных словарях.

Затем на данный коэффициент происходит умножение работы функции fuzzywuzzy.fuzz.WRatio

Экспериментальная табличка

Слово Частота на слайде Частота в транскрипте Вес Промежуточный аддитивный k
цель 2 1 0.029411764705882353 0.029411764705882353
работа 3 4 0.08823529411764706 0.11764705882352941
разработать 3 3 0.08823529411764706 0.20588235294117646
лабораторный 3 3 0.08823529411764706 0.29411764705882354
задача 2 1 0.029411764705882353 0.3235294117647059
система 2 2 0.058823529411764705 0.3823529411764706
проверка 2 2 0.058823529411764705 0.44117647058823534
Результирующий весовой коэффициент: 1.0630252100840336

Вывод

Таким образом, если выступающий сказал достаточно слов со слайда "Цели и задачи", мы повысим его оценку за этот слайд даже, если он местами говорил то, чего на этом слайде нет. Повышение происходит засчет увеличения оценки за слово, которое есть как на слайде, так и в транскрипте на коэффициент больший единицы

Clone this wiki locally