-
Notifications
You must be signed in to change notification settings - Fork 0
Алгоритм взвешенной оценци значимого слайда v1.0
Значимым слайдом на данный момент принято считать сдайд с заголовком "Цели и Задачи"
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
- Для сравнения транскрипции доклада с текстом на слайде используется функция функция
fuzzywuzzy.fuzz.WRatio
, модифицированная весовыми коэффициентами - Весовой коэффициент считается в зависимости от частоты употребления слова на слайде
Рассмотрим подробности получения весового коэффициента:
Текст разбивается на токены, затем мы считаем словари частот для 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
|
Таким образом, если выступающий сказал достаточно слов со слайда "Цели и задачи", мы повысим его оценку за этот слайд даже, если он местами говорил то, чего на этом слайде нет. Повышение происходит засчет увеличения оценки за слово, которое есть как на слайде, так и в транскрипте на коэффициент больший единицы