From 40057f797169d89fb56a5da076a7d9fc0298d6e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gi=C3=B2=20Diani?= Date: Fri, 17 Jan 2025 08:54:42 +0100 Subject: [PATCH] sentiments colors, topics in dashboard --- VANA-php/resources/css/app.css | 31 ++++++++++++ VANA-php/resources/js/app.js | 53 ++++++--------------- VANA-php/resources/views/detail.blade.php | 34 +++++-------- VANA-php/routes/web.php | 21 +++++++- VANA-python/subtitles_processing/README.md | 8 +++- database.sqlite | Bin 7938048 -> 7938048 bytes 6 files changed, 84 insertions(+), 63 deletions(-) diff --git a/VANA-php/resources/css/app.css b/VANA-php/resources/css/app.css index 321b444..8c15ff0 100644 --- a/VANA-php/resources/css/app.css +++ b/VANA-php/resources/css/app.css @@ -238,6 +238,10 @@ main { gap: 1em; } +ol{ + padding-left: 1em +} + #video { grid-area: video; } @@ -343,3 +347,30 @@ ul.segments li{ .track-viz svg{ width: 100% !important; } + +#sentiments-list{ + list-style: none; + padding: 0; +} + +#sentiments-list li{ + margin-top: .5em; +} + +#sentiments-list span{ + display: inline-block; + background: #d01c8b; + width: 1.5em; + height: 1.5em; + border-radius: 50%; + text-align: center; +} + +#sentiments-list span.pos{ + background: #4dac26; +} + +#sentiments-list span.neut{ + background: #f7f7f7; + color: #000; +} diff --git a/VANA-php/resources/js/app.js b/VANA-php/resources/js/app.js index 90e6b56..b3ce73a 100644 --- a/VANA-php/resources/js/app.js +++ b/VANA-php/resources/js/app.js @@ -47,6 +47,8 @@ function setWordCountChart(){ // let max = totalWordCount / count; let data = []; + + let wordWordsLen = wordWords.length; let chunks = Math.floor(wordWordsLen / count); @@ -69,8 +71,6 @@ function setWordCountChart(){ } }) - console.log(max) - for(let i = 0; i < count; i++){ grid.push({ left: `${i * (100 / count)}%`, @@ -170,12 +170,22 @@ const chartSentimentsOptions = { type: "category", data: ["-1", "0", "1"] }, - color: '#fff', series: [ { symbolSize: sentiWeights, data: sentiPol, - type: 'scatter' + type: 'scatter', + itemStyle: { + color: (e) => { + if(e.data == -1){ + return '#d01c8b' + }else if(e.data == 0){ + return '#f7f7f7' + }else{ + return '#4dac26' + } + } + } } ] }; @@ -288,40 +298,5 @@ document.querySelector('#timeline-bar').addEventListener('click', e => { player.currentTime(calcCurrenttimeByPosition(x)); }) */ -const topics = [ - ["Topic1 Topic2 Topic3"], - ["Topic1 Topic2 Topic3", "Topic3 Topic4 Topic5"], - ["Topic1 Topic2 Topic3", "Topic3 Topic4 Topic5", "Topic6 Topic7 Topic8"], - ["Topic1 Topic2 Topic3", "Topic3 Topic4 Topic5", "Topic1 Topic2 Topic3", "Topic1 Topic2 Topic3"], - ["Topic1 Topic2 Topic3", "Topic3 Topic4 Topic5", "Topic1 Topic2 Topic3", "Topic1 Topic2 Topic3", "Topic1 Topic2 Topic3"], - ["Topic1 Topic2 Topic3", "Topic3 Topic4 Topic5", "Topic1 Topic2 Topic3", "Topic1 Topic2 Topic3", "Topic1 Topic2 Topic3", "Topic1 Topic2 Topic3"], - ["Topic1 Topic2 Topic3", "Topic3 Topic4 Topic5", "Topic1 Topic2 Topic3", "Topic1 Topic2 Topic3", "Topic1 Topic2 Topic3", "Topic1 Topic2 Topic3", "Topic1 Topic2 Topic3"], - ["Topic1 Topic2 Topic3", "Topic3 Topic4 Topic5", "Topic1 Topic2 Topic3", "Topic1 Topic2 Topic3", "Topic1 Topic2 Topic3", "Topic1 Topic2 Topic3", "Topic1 Topic2 Topic3", "Topic1 Topic2 Topic3"], - ["Topic1 Topic2 Topic3", "Topic3 Topic4 Topic5", "Topic1 Topic2 Topic3", "Topic1 Topic2 Topic3", "Topic1 Topic2 Topic3", "Topic1 Topic2 Topic3", "Topic1 Topic2 Topic3", "Topic1 Topic2 Topic3", "Topic1 Topic2 Topic3"], - ["Topic1 Topic2 Topic3", "Topic3 Topic4 Topic5", "Topic1 Topic2 Topic3", "Topic1 Topic2 Topic3", "Topic1 Topic2 Topic3", "Topic1 Topic2 Topic3", "Topic1 Topic2 Topic3", "Topic1 Topic2 Topic3", "Topic1 Topic2 Topic3", "Topic1 Topic2 Topic3"], -]; - -function setTopicSegments(count){ - - let html = ''; - - topics[count - 1].forEach(t => { - html += `
  • ${t}
  • `; - }) - - let list = document.querySelector('#topic-segement-list'); - list.innerHTML = html; - list.style.gridTemplate = `1fr / repeat(${count}, 1fr)`; - -} -let topicSegmentCtrl = document.getElementById('topic-track-segment-ctrl'); - -topicSegmentCtrl.addEventListener('change', e => { - setTopicSegments(e.target.value); - -}) - -setTopicSegments(topicSegmentCtrl.value); - diff --git a/VANA-php/resources/views/detail.blade.php b/VANA-php/resources/views/detail.blade.php index 5ed17f4..1986e02 100644 --- a/VANA-php/resources/views/detail.blade.php +++ b/VANA-php/resources/views/detail.blade.php @@ -31,7 +31,7 @@
    + Topics
    @@ -69,9 +69,15 @@
    @@ -109,27 +115,13 @@

    Sentiment

    -

    1 = Positiv
    0 = Neutral
    -1 = Negativ

    +
      +
    • 1 = Positiv ({{ round($senti_subdata['verteilung_perc']['positive']) }}%)
    • +
    • 0 = Neutral ({{ round($senti_subdata['verteilung_perc']['neutral']) }}%)
    • +
    • -1 = Negativ ({{ round($senti_subdata['verteilung_perc']['negative']) }}%)
    -
    -
    -

    Topics

    - -
    -
    -
      -
    • 1
    • -
    • 2
    • -
    • 3
    • -
    • 4
    • -
    -
    -
    diff --git a/VANA-php/routes/web.php b/VANA-php/routes/web.php index ac3b8a8..1986db9 100644 --- a/VANA-php/routes/web.php +++ b/VANA-php/routes/web.php @@ -23,23 +23,40 @@ Route::get('/detail/{id}', function(int $id) { $subtitles = $ep->subtitles; $mediacomposition = json_decode($ep->mediacomposition, 1); $durationSteps = $mediacomposition['chapterList'][0]['duration'] / 1000 / 10; + $topics = json_decode($ep->topics); $subdata = json_decode($ep->subtitle_data, 1); $subdata_senti = json_decode($ep->sentiments_from_sub, 1); + $subdata_senti['data'] = ""; $subdata_senti['weights'] = ""; + $subdata_senti['verteilung'] = ['neutral' => 0, 'negative' => 0, 'positive' => 0]; + foreach ($subdata_senti['sentiments'] as $value) { $subdata_senti['data'] .= $value[0].","; - $subdata_senti['weights'] .= (30 * $value[1]).","; + $subdata_senti['weights'] .= (50 * $value[1]).","; + if($value[0] === 0){ + $subdata_senti['verteilung']['neutral']++; + }else if($value[0] === 1){ + $subdata_senti['verteilung']['positive']++; + }else{ + $subdata_senti['verteilung']['negative']++; + } } + $subdata_senti_all = $subdata_senti['verteilung']['neutral'] + $subdata_senti['verteilung']['negative'] + $subdata_senti['verteilung']['positive']; + + $subdata_senti['verteilung_perc'] = ['negative' => (100 / $subdata_senti_all) * $subdata_senti['verteilung']['negative'], 'neutral' => (100 / $subdata_senti_all) * $subdata_senti['verteilung']['neutral'], 'positive' => (100 / $subdata_senti_all) * $subdata_senti['verteilung']['positive']]; + + $wordsPerMinute = array_slice($subdata['word_count'], -1)[0] / (($mediacomposition['chapterList'][0]['duration'] / 1000) / 60); $parser = new Podlove\Webvtt\Parser(); $subtitles = $parser->parse($subtitles); - return view('detail', ['title' => $title, 'subtitles' => $subtitles, 'mediacomposition' => $mediacomposition, 'durationSteps' => $durationSteps, 'dom_color' => $ep->viz_data, 'subdata' => $subdata, 'senti_subdata' => $subdata_senti, 'wpm' => $wordsPerMinute]); + + return view('detail', ['title' => $title, 'subtitles' => $subtitles, 'mediacomposition' => $mediacomposition, 'durationSteps' => $durationSteps, 'dom_color' => $ep->viz_data, 'subdata' => $subdata, 'senti_subdata' => $subdata_senti, 'wpm' => $wordsPerMinute, 'topics' => $topics]); }); diff --git a/VANA-python/subtitles_processing/README.md b/VANA-python/subtitles_processing/README.md index ece58c9..c1a57f7 100644 --- a/VANA-python/subtitles_processing/README.md +++ b/VANA-python/subtitles_processing/README.md @@ -14,8 +14,14 @@ Zählt die Wortanzahl pro Satz. python src/normalize_subtitles/count_words.py -ep ``` -## count_words.py +## sentence_sentiment.py Rechnet die Sentimente pro Satz. ```bash python src/normalize_subtitles/sentence_sentiment.py -ep ``` + +## topics.py +Generiert Topics mittels LDA. +```bash +python src/normalize_subtitles/topics.py -ep +``` diff --git a/database.sqlite b/database.sqlite index 446ef797cf9068ea99a8c70ccb1435a4427358ce..995f457a4246e36e6e72bf2baf09ed0648ae0d47 100644 GIT binary patch delta 709 zcma)$$xf4D07d`b76e2-1}6k8;;e`*lM^aZnWq*g1r`JdpPM%v=uzhewJlAEZev& z<1!s)$t)pbuH;eVoeA}#BX5IYS;Jf*=s3$Sd@r8!X-+@UQs6YiT&b$I4BN@!{UfI zDvpVAaa>f0RE%4AM5U+_)uKk!ij(4$I4#bIv!YI%6X(SRQ7%OdDTc*}7!_k8B*sNp fM8t%Mid$k*#Kdh87k9*zxGV07`(k>D2djSp@Speo delta 1386 zcmb7?$!}X_6vdwtCp4X2+ADhuq|D%V2hMhL5N{jAt4oz03qxKWs?P|uD+xDNoVo9_uS39KMij7 z-p3}xz%8?DXh4|gChufFshl>BJQPlTaQx3>&5?)0yTiLfU+j#Jem63`C5(+M3FmH} z{cy;b^H~FNDX&zt&U!8Ah>{tx(#&)15F(ZGYdj^z@(Z z`5CRF=vva7ig~N$Y)4uQ`R3H1T5O~}^{}!K3`Zutji@K+j~1%(a?&fS2_>Ysw$+WR zi$f`UN``nN$Lr8p*P@^7FUv%_oo{F^}2lQTdOEB+)%8C+>)+@1^-|sJ{!ZWpSIOI=<=G;nF zm8WugNxDu&`3v5YbCpuC`ztqTyiE7c3&zn+sTx(N-%EM(*=7e9n%WwLQxJD z^}1@6^u*(AbjfjjOEB$&wkz#QJd?Xo%oSGbQre-V?e>}+cLqyZr)IM|Y?IS#eyMp7 zG?gsY(xqxs>8Rd-Pf=rWZ7or%R|6eyKXyGe*|KYS&8NPn zjP%<_M+HGJin1VnBg*1!vAr|8DT=o~yS#B}aLI7kqa5p-4?BjbZ~osaTKw;fEPeN3 zqcrbL^FR>)5`Pze6(5K{^y=H4Q`TMaqH$0#jP=FR7js`sd;a@^_=ot5__KIl{JK|P z_WWOo7mf@X4Y}U&kL@-0x|T;xFFf<3rnfxP=T_tVr$+1ij?wz}>x6+AAO;B|F+>a# zPY_3l5#lIuj5to5AWjk@F-n{wP7`N{CyA$sr-^5XXNj}KbA*X76Bc5OI7d8Bj1%XH z7l;eQi^NOB%fu_htHed(HR2L+nV2AYFjm4wOcGPXG+`%Zh%3Y_F-N>Xyh&Uo-Xh*6 z-XZ1*2jL`Kgq!dXUcyH#5Pm`;773XM5J4hDgoy~D5K$sV#0iy15J@6MXvDk3HDZZ) ykGM{NNE6FMhR6~t#43>^bYhLj69uA3l!!7>A*w`;c%QgI)QJYMPBd?$b@yLAH`loU