tag:crieit.net,2005:https://crieit.net/tags/%E3%82%AF%E3%82%BD%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0/feed 「クソアルゴリズム」の記事 - Crieit Crieitでタグ「クソアルゴリズム」に投稿された最近の記事 2023-01-14T21:46:42+09:00 https://crieit.net/tags/%E3%82%AF%E3%82%BD%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0/feed tag:crieit.net,2005:PublicArticle/18315 2022-11-10T19:08:50+09:00 2023-01-14T21:46:42+09:00 https://crieit.net/posts/Youtube-Un-programme-Ruby-merdique-qui-rassemble-des-informations-sur-les-vid-os-youtube-en-utilisant-l-algorithme-youtube-merdique グレートクソアルゴリズム | くだらない youtube アルゴリズムを使用して youtube ビデオに関する情報を収集するくだらない Ruby プログラム <p><a target="_blank" rel="nofollow noopener" href="https://crieit-net.translate.goog/posts/Youtube-Un-programme-Ruby-merdique-qui-rassemble-des-informations-sur-les-vid-os-youtube-en-utilisant-l-algorithme-youtube-merdique?_x_tr_sl=ja&_x_tr_tl=en&_x_tr_hl=ja&_x_tr_pto=wapp">translate</a></p> <p><a href="https://crieit.net/posts/c2b7c645c32fda0b2cffd3aea91d6a01#狂ったアルゴリズムは チートされる">クソアルゴリズム</a></p> <p><a href="https://crieit.now.sh/upload_images/1e2d4057a6bad42b7364c8cd67d12d3b636b9e02e07f5.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/1e2d4057a6bad42b7364c8cd67d12d3b636b9e02e07f5.png?mw=700" alt="" /></a></p> <h1 id="クソアルゴリズムにたいして、クソアルゴリズムを利用して、必要なものだけを選別していくものを書いてみる。"><a href="#%E3%82%AF%E3%82%BD%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%AB%E3%81%9F%E3%81%84%E3%81%97%E3%81%A6%E3%80%81%E3%82%AF%E3%82%BD%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%A6%E3%80%81%E5%BF%85%E8%A6%81%E3%81%AA%E3%82%82%E3%81%AE%E3%81%A0%E3%81%91%E3%82%92%E9%81%B8%E5%88%A5%E3%81%97%E3%81%A6%E3%81%84%E3%81%8F%E3%82%82%E3%81%AE%E3%82%92%E6%9B%B8%E3%81%84%E3%81%A6%E3%81%BF%E3%82%8B%E3%80%82">クソアルゴリズムにたいして、クソアルゴリズムを利用して、必要なものだけを選別していくものを書いてみる。</a></h1> <p>え、突然なに ? と思うかもしれないが、やっぱり怒ってるんだな。<br /> <a target="_blank" rel="nofollow noopener" target="_blank" rel="nofollow noopener" href="http://www.zariganiworks.co.jp/korejanairobo/">これじゃないロボ</a>ってわかるかなぁ。</p> <blockquote> <p>欲しかったロボはこれじゃない!世界中から子供たちの悲痛な叫びが聞こえる情操教育玩具。グッドデザイン賞受賞の伝説的玩具。<br /> コレジャナイロボ(The Original Model)<br /> <a target="_blank" rel="nofollow noopener" href="https://www.assiston.co.jp/1595">https://www.assiston.co.jp/1595</a></p> </blockquote> <p>わかんないと思うな。</p> <h2 id="コレジャナイ ユーチューブ"><a href="#%E3%82%B3%E3%83%AC%E3%82%B8%E3%83%A3%E3%83%8A%E3%82%A4+%E3%83%A6%E3%83%BC%E3%83%81%E3%83%A5%E3%83%BC%E3%83%96">コレジャナイ ユーチューブ</a></h2> <p>何を怒っているか整理すると、Youtube 検索結果について。</p> <p>簡単に言うと、探したいものがあって、探してるときに、あなたの探してるものと関係ありそうなもの教えてあげる的に頼んでもない集合知をほいって添えられて、それを断るすべがないということについて。</p> <p>探しているものがはっきりしていて、その言葉で検索かけているときに、ほいっ、あなたの前回見た動画から他の人が見たのこれだから、こんなの面白いみたいよ、どぞー !! って検索結果に混ぜられるの意味あると思うのか ?? まともに考えて。それ、おすすめ映画をレコメンドするアルゴリズムだよね。それ、バカでしかないからやめてほしいんだ。</p> <h2 id="それ、バカでしかないからやめてほしいんだ youtube . . ."><a href="#%E3%81%9D%E3%82%8C%E3%80%81%E3%83%90%E3%82%AB%E3%81%A7%E3%81%97%E3%81%8B%E3%81%AA%E3%81%84%E3%81%8B%E3%82%89%E3%82%84%E3%82%81%E3%81%A6%E3%81%BB%E3%81%97%E3%81%84%E3%82%93%E3%81%A0+youtube+.+.+.">それ、バカでしかないからやめてほしいんだ youtube . . .</a></h2> <p>例えば、<code>ransomware</code> というキーワードで検索したとして、それと前回たまたま見た何かの動画とは全く関係ない趣向で、今検索してるのに、じゃあこれもって一言も <code>ransomware</code> のことなんて発言しない youtuber のたくさん視聴された関連動画を検索結果に混ぜてくるのって、「機械学習してるからー」てことを人間が配慮してあげないとしたら、意味不明のバカでしかない。</p> <p>意味不明のバカでしかない . . .</p> <p>意味不明のバカな結果を出すアルゴリズムを権威的に出してくるって、意味不明なバカレベルである。だから、やめて、と思うだけなんだな。<br /> 他人の行動も、過去の自分のトレンドも全く関係がない TPO が読めないアルゴリズムって、ただの邪魔だ、ということ。<br /> そんなことは当たり前過ぎるのに、なぜか当然のように諦めさせらるとっても不毛なシステムだ。<br /> これがなんでもかんでも Collaborative filtering 。</p> <p>この配慮のない他人の行動をどんなときにも当てはめようとしてくる様式をクソアルゴリズムと呼ばずにはおれない。</p> <p>でも、クソとかバカとかいうのも、どうにもならないわかりきったことで、単に Google が正しくキュレーションされたものより、てっとりばやく消費される季節ネタのようなバズを見えるとこに置いた方が広告の流入になるという方針なだけで、そういった正攻法はかつて創業者によって「情報の精度が落ちる要因」とされているので、クソなことをわかってやっていて、かつて 2000 年代に蔓延したアホみたいなインデックス型のサーチエンジン並みのクオリティを実現するアルゴリズムを新参のカウンターとして、知的に駆逐した彼ら google 自身が「今」作っているということ。</p> <p>The Age of PageRank is Over<br /> 09 Nov, 2022<br /> Vladimir Prelovac<br /> CEO, Kagi Inc.<br /> <a target="_blank" rel="nofollow noopener" href="https://blog.kagi.com/age-pagerank-over">https://blog.kagi.com/age-pagerank-over</a></p> <p>もちろん、そんな 20 年以上レイドバックしたテクは 22 年以上前の<a href="https://crieit.net/posts/c2b7c645c32fda0b2cffd3aea91d6a01">板フロート掲示板王子</a>によってチートされている。「クソをクソだと見抜けない人が使っている」ということが、クソの臭い嗅ぎ王子には見透かされたと言っていい。たぶん、世界中同じような状況じゃないかと思う。だって、結局古いんだもん。</p> <p>というところまででクソアルゴリズムを悪く言うのはここまでにして、じゃあ、どうすればいいの ?<br /> 自分の決めたキーワードとの関連はどうやって判断するのか ? を考えてみる。</p> <h2 id="キーワードと youtube 動画の相関は、タイトルにキーワードが含まれるか ? だけで判断するということにする。"><a href="#%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89%E3%81%A8+youtube+%E5%8B%95%E7%94%BB%E3%81%AE%E7%9B%B8%E9%96%A2%E3%81%AF%E3%80%81%E3%82%BF%E3%82%A4%E3%83%88%E3%83%AB%E3%81%AB%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89%E3%81%8C%E5%90%AB%E3%81%BE%E3%82%8C%E3%82%8B%E3%81%8B+%3F+%E3%81%A0%E3%81%91%E3%81%A7%E5%88%A4%E6%96%AD%E3%81%99%E3%82%8B%E3%81%A8%E3%81%84%E3%81%86%E3%81%93%E3%81%A8%E3%81%AB%E3%81%99%E3%82%8B%E3%80%82">キーワードと youtube 動画の相関は、タイトルにキーワードが含まれるか ? だけで判断するということにする。</a></h2> <p>含まれていたら、関連動画としてリストに追加するし、含まれていなければそれ以上関係性を考慮しない。これだけのストレートなルールを設定する。<br /> なので、<strong>youtube 動画のタイトルが web ページのデータ上のどこにあるのかを割り出すことが必要</strong>。</p> <p>キーワードで youtube 検索するには、</p> <p><a target="_blank" rel="nofollow noopener" target="_blank" rel="nofollow noopener" href="https://www.youtube.com/results?search_query=ransomware">https://www.youtube.com/results?search_query=ransomware</a></p> <p>で、get する。そうすると、検索結果を表示するリダイレクトが youtube ページで行われる。</p> <p><a href="https://crieit.now.sh/upload_images/c7f4777602b710c4097ff1781f2c2303636c61830680c.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/c7f4777602b710c4097ff1781f2c2303636c61830680c.png?mw=700" alt="" /></a></p> <p>この行為を Ruby コードで書くと、</p> <h3 id="code : 01"><a href="#code+%3A+01">code : 01</a></h3> <pre><code class="ruby">require 'uri' require 'net/http' words = "ransomware" keywords = URI.encode_www_form(search_query: words) target = 'https://www.youtube.com/results?' << keywords resp_0 = Net::HTTP.get_response(URI.parse(target)) </code></pre> <p>ページのなかの、<code><script></code> のうちの1つに検索結果の情報が詰まっている。</p> <p><code><script></code> というタグはいくつもあって、その <strong>34 番目</strong>が検索結果の JSON に該当するよ。<br /> <strong>44 番目</strong>になったかも ?</p> <h3 id="code : 02"><a href="#code+%3A+02">code : 02</a></h3> <pre><code class="ruby">require 'nokogiri' doc = Nokogiri::HTML.parse(resp_0.body, nil,'utf-8') script_tag = doc.css('script') json_str = "" script_tag.each_with_index {|element,i| if i == 33 then json_str = element.to_s[58..-11] #<script nonce="fX_rKtuwcvo7T-wFeZz4CQ">var ytInitialData = end } doc = nil </code></pre> <p><strong>34 番目</strong>の <code><script></code> に入っているものを取り出すと、 JSON データ構造としては余計なスクリプトが含まれているので、後に JSON としてパースするのに邪魔になるので、<code>element.to_s[58..-11]</code> というように、ノードからテキストにして、インデックスを使ってスライスして、JSON データとして扱える strings にします。この youtube レクチャーを参考にしましたよ。</p> <p><a target="_blank" rel="nofollow noopener" href="https://youtu.be/QNLBBGWEQ3Q">Python Web Scraping: JSON in SCRIPT tags : John Watson Rooney</a></p> <p><strong>Python code:</strong><br /> <a href="https://crieit.now.sh/upload_images/26d0de6370fbe42940027436f916009663709fc93d713.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/26d0de6370fbe42940027436f916009663709fc93d713.png?mw=700" alt="image" /></a><br /> <a href="https://crieit.now.sh/upload_images/9bbcc2323c41efdc25de88ec00c1cf2463709f2ca78bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/9bbcc2323c41efdc25de88ec00c1cf2463709f2ca78bc.png?mw=700" alt="image" /></a></p> <p><a target="_blank" rel="nofollow noopener" href="https://rentry.co/u89yc">https://rentry.co/u89yc</a><br /> <a target="_blank" rel="nofollow noopener" href="https://rentry.co/t94yo">https://rentry.co/t94yo</a></p> <h3 id="code : 03"><a href="#code+%3A+03">code : 03</a></h3> <pre><code class="ruby">require 'json' begin script33 = JSON.parse(json_str) rescue => e puts e # return nil end </code></pre> <p>JSON を parse するとは hash にするということなので、key と value のひたすら折り重なる廻廊となる、key も value(s) もあらかじめ知ってたら、スムーズだけれども、この JSON のデータ構造は知らない、知りたくないという場合は、いったん JSON をテキストファイルにして、vim エディターでよく見る。必要なら編集してキーワードサーチして、じっと見る。必要なら何時間も、何日間も見る。<br /> 大体わかったら、JSON らしくないレギュラーエクスプレッションズで処理できる。<br /> 取り出したいのは videoId と title 。</p> <p>videoId は、url 上ではこうなっている。<br /> <code>https://www.youtube.com/watch?v=</code> + videoId<br /> なので基本的な url から videoId を取り出すのは、<code>watch?v=</code> 以降の <strong>11 文字</strong>を切り出したらいい。</p> <p>rf.<br /> <a target="_blank" rel="nofollow noopener" href="https://stackoverflow.com/questions/3452546/how-do-i-get-the-youtube-video-id-from-a-url">stackoverflow.com : How do I get the youtube video-id from a URL</a></p> <p>これが基本事項だけども、以下は JSON データから <code>"videoId"="●●●●●●●●●●●"</code> というところから抜き出していくコードになっている。</p> <h3 id="code : 04"><a href="#code+%3A+04">code : 04</a></h3> <pre><code class="ruby">script33 = JSON.parse(json_str) # JSON to Hash videoid_list = [] # temp work space for youtube 'video-id' s videotitle_list = [] # temp work space for youtube 'video title' s script33.each do |y,x| if y == 'contents' x.each do |yy,xx| match = xx.to_s.match(/(\"videoId\"=\>.{13})/) if match != nil temp = $&[11..-1] videoid_list.push(temp) while $'.match(/(\"videoId\"=\>[^\[].{12})/) != nil do videoid_list.push($&[11..-1]) end end match2 = xx.to_s.match(/\"title\"=\>\{\"runs.+?\[\{\"text\"\=\>(.*?)\}\],/) if match2 != nil temp = $1 videotitle_list.push(temp) while $'.match(/\"title\"=\>\{\"runs.+?\[\{\"text\"=\>(.*?)\}\],/) != nil do videotitle_list.push($1) end end end end end </code></pre> <p>youtube でキーワード検索した結果の <code>videoId</code> と、 <strong>title ぽいもの</strong>が、いくつづつかそれぞれ配列に入る。<br /> <code>videoId</code>については以下のページの一番最初のほうで少し書いたので参考にしてほしい。</p> <blockquote> <p><strong>アルゴリズムはチートされる 注目と広告、アテンション エコノミー / attention economy</strong><br /> <a href="https://crieit.net/posts/c2b7c645c32fda0b2cffd3aea91d6a01">https://crieit.net/posts/c2b7c645c32fda0b2cffd3aea91d6a01</a></p> </blockquote> <p>ここからは、データは重複していく可能性があることに気をつけていく。<br /> <strong>title ぽいもの</strong>は、いちばん最後に <strong>title じゃないもの</strong>が配列にプッシュされているので取り除いておく。これは、Hash の処理で取り出さずにレギュラーエクスプレッションズの文字列処理で条件を書いてスキャンしたので起こったことなので、きっちり Hash で取り出せばうまいこといくと思われる。ただ、今回はレギュラーエクスプレッションズの処理にした。</p> <h3 id="code : 05"><a href="#code+%3A+05">code : 05</a></h3> <pre><code class="ruby">videoid_list.uniq! videotitle_list.pop # trash videotitle_list.uniq! </code></pre> <p>strings の値、それぞれの配列の値、並び方は、とにかくよーく確かめてね。<br /> 確かめないと、以後の行程で全く意味ないからね。</p> <h3 id="code : 06"><a href="#code+%3A+06">code : 06</a></h3> <pre><code class="ruby">id_list = [] title_list = [] videoid_list.each_with_index {|content,ind| if videotitle_list[ind] != nil # puts &quot;-&quot;*20 # puts &quot;#{ind} https://www.youtube.com./watch?v=#{content[1..-2]}&quot; # puts videotitle_list[ind] mmmm = videotitle_list[ind].match(/#{words}/i) if mmmm != nil id_list.push(content) title_list.push(videotitle_list[ind]) end else # puts &quot;-&quot;*20 # puts &quot;no title found&quot; # puts &quot;#{ind} https://www.youtube.com./watch?v=#{content[1..-2]}&quot; end } videoid_list.clear videotitle_list.clear </code></pre> <p>検索した結果のタイトルにキーワードにした <code>ransomware</code> が含まれていればリストに追加するし、キーワードが含まれていない場合は無関係という判断でリストから外します。<br /> 残すリストをそれぞれの配列 <code>id_list = []</code> <code>title_list = []</code> に追加していく。</p> <h3 id="code : 07"><a href="#code+%3A+07">code : 07</a></h3> <pre><code class="ruby">id_list = id_list.zip(title_list) </code></pre> <p>zip してひとまとめにしておく。</p> <p>こうなってるかな。</p> <h3 id="code : 08"><a href="#code+%3A+08">code : 08</a></h3> <pre><code class="ruby">id_list.each_with_index do |list,ind| puts "#{ind}: videoId => #{list[0]}" puts "#{ind}: title => #{list[1]}" end </code></pre> <p>じゃあ、まず、この第一回目の検索の結果を使って、10 スレッドづつ https get するようにしてテスト。</p> <h3 id="code : 09"><a href="#code+%3A+09">code : 09</a></h3> <pre><code class="ruby">#mute = Mutex.new counter = 0 db_counter = 0 while id_list.size > 0 && counter < 20000 do counter += 1 threads = [] 10.times do |k| if id_list.size > 0 threads << Thread.new do #mute.synchronize do tempwork = id_list.shift if tempwork == nil next end target = "https://www.youtube.com/watch?v=" << tempwork[0][1..-2] id_title_list = work(target,words) if id_title_list != nil id_list.concat(id_title_list) end #end end end end threads.each(&:join) id_list.uniq! puts id_list.size end </code></pre> <h3 id="code : 10"><a href="#code+%3A+10">code : 10</a></h3> <p>work 関数<br /> <a target="_blank" rel="nofollow noopener" href="https://rentry.co/dzyu8">https://rentry.co/dzyu8</a></p> <p>work 関数は https get から始まる <strong>code : 01</strong> ~ <strong>code : 04</strong> とよく似ているが、今度は最初の https get で得たキーワード検索結果の JSON とは違っているので、<code><script></code> の順番も違い、<strong>41 番目</strong>の <code><script></code> から JSON データをとってきている。<br /> ということで当然 JSON のデータ構造も、キーワード検索結果の <strong>code : 04</strong> ものとは別物なので、そこから videoId や title の値をスクレイプするレギュラーエクスプレッションズも新たなものになっている。</p> <p><strong>44 番目</strong>になったかも ?</p> <h3 id="code : 11"><a href="#code+%3A+11">code : 11</a></h3> <p><strong>code : 01</strong> ~ <strong>code : 10</strong> までを全部まとめて、さらに SQLite3 データベースに保存していくようにするとこうなる。</p> <p><a target="_blank" rel="nofollow noopener" href="https://rentry.co/359r5">https://rentry.co/359r5</a></p> <p>ここまでで、ようやく半分。Step 1 として、これを補完する Step 2。</p> <p><a target="_blank" rel="nofollow noopener" href="https://rentry.co/b4ugy">https://rentry.co/b4ugy</a></p> <p>これで、全部の半分。<br /> 並べて見ると</p> <h4 id="Step1"><a href="#Step1">Step1</a></h4> <pre><code class="ruby"># encoding: UTF-8 require 'net/http' require 'uri' require 'sqlite3' require 'time' require 'json' require 'nokogiri' SQL =<<EOS create table youtube ( id INTEGER PRIMARY KEY, videoid text, chan_id text, publ_id text, title text ); EOS system("mkdir" ,"youtube__") db = SQLite3::Database.open("./youtube__/youtube.db") db.execute(SQL) words = "ransomware" keywords = URI.encode_www_form(search_query: words) target = 'https://www.youtube.com/results?' << keywords resp_0 = Net::HTTP.get_response(URI.parse(target)) doc = Nokogiri::HTML.parse(resp_0.body, nil,'utf-8') script_tag = doc.css('script') json_str = "" script_tag.each_with_index {|element,i| if i == 33 then json_str = element.to_s[58..-11] #<script nonce="fX_rKtuwcvo7T-wFeZz4CQ">var ytInitialData = end } doc = nil script33 = JSON.parse(json_str) videoid_list = [] videotitle_list = [] script33.each do |y,x| if y == 'contents' x.each do |yy,xx| match = xx.to_s.match(/(\"videoId\"=\>.{13})/) if match != nil temp = $&[11..-1] videoid_list.push(temp) while $'.match(/(\"videoId\"=\>[^\[].{12})/) != nil do videoid_list.push($&[11..-1]) end end match2 = xx.to_s.match(/\"title\"=\>\{\"runs.+?\[\{\"text\"=\>(.*?)\}\],/) if match2 != nil temp = $1 videotitle_list.push(temp) while $'.match(/\"title\"\=\>\{\"runs.+?\[\{\"text\"\=\>(.*?)\}\],/) != nil do videotitle_list.push($1) end end end end end videoid_list.uniq! videotitle_list.pop # trash scan videotitle_list.uniq! id_list = [] title_list = [] videoid_list.each_with_index {|content,ind| if videotitle_list[ind] != nil # puts &quot;-&quot;*20 # puts &quot;#{ind} https://www.youtube.com./watch?v=#{content[1..-2]}&quot; # puts videotitle_list[ind] mmmm = videotitle_list[ind].match(/#{words}/i) if mmmm != nil id_list.push(content) title_list.push(videotitle_list[ind]) end else # puts &quot;-&quot;*20 # puts &quot;no title found&quot; # puts &quot;#{ind} https://www.youtube.com./watch?v=#{content[1..-2]}&quot; end } videoid_list.clear videotitle_list.clear id_list = id_list.zip(title_list) def work(target,words) begin resp_1 = Net::HTTP.get_response(URI.parse(target)) rescue => e puts e sleep 1 return nil end doc = Nokogiri::HTML.parse(resp_1.body, nil,'utf-8') script_tag = doc.css('script') json_str = "" script_tag.each_with_index {|element,i| if i == 40 then json_str = element.to_s[58..-11] end } script_tag = nil title_tag = doc.css('title') doc = nil mmmm = title_tag[0].to_s.match(/#{words}/i) if mmmm == nil return nil end title_tag = nil begin script40 = JSON.parse(json_str) rescue => e puts e return nil end videoid_list2 = [] videotitle_list2 = [] script40.each {|y,x| if y.to_s == "contents" match1 = x.to_s.match(/\{\"title\"=\>\{\"runs\"=\>\[\{\"text\"=\>\"(.*?)\"/) if match1 != nil # puts&quot;&quot; # puts&quot;-&quot;*30 # puts $1 # puts $~ # puts&quot;-&quot;*30 tempstrings = $' while tempstrings.match(/\"title\"=\>\{\"accessibility\"=\>\{\"accessibilityData\"=\>\{\"label\"=\>"(.*?)\"\}\},/) do if $0 == nil break end # puts&quot; _&quot;*20 # puts&quot;&quot; # puts $1 tempstrings = $' videotitle_list2.push($1) match_videoid = /\"commandMetadata\"=\>\{\"webCommandMetadata\"=\>\{\"url\"=\>\"\/watch\?v=(.{11}\"),/ =~ $' if match_videoid != nil # puts (&quot;\&quot;&quot; + $1) videoid_list2.push("\"" + $1) end end else # puts &quot;-&quot;*30 # puts y x # puts &quot;can't find the title&quot; next end end } videoid_list2.uniq! videotitle_list2.uniq! videoid_list3 = [] videotitle_list3 = [] videoid_list2.each_with_index {|content,ind| if videotitle_list2[ind] == nil # puts &quot;-&quot;*30 # puts &quot;error&quot; # puts ind,content # puts &quot;https://www.youtube.com./watch?v=#{content[1..-2]}&quot; # puts &quot;-&quot;*30 next end mmmm = videotitle_list2[ind].match(/#{words}/i) if mmmm == nil # puts &quot;-&quot;*30 # puts ind,content # puts videotitle_list2[ind] # puts &quot;skip&quot; next end #puts "-"*30 #puts ind,content videoid_list3.push(content[0..-1]) #puts "https://www.youtube.com./watch?v=#{content[1..-2]}" #puts videotitle_list2[ind] videotitle_list3.push(videotitle_list2[ind]) } videoid_list2.clear videotitle_list2.clear ziped_list = videoid_list3.zip(videotitle_list3) videoid_list3.clear # ziped_list.each_with_index do |list,ind| # puts &quot;#{ind}: #{list[0]}&quot; # puts &quot;#{ind}: #{list[1]}&quot; # end return ziped_list end #youtube = Struct.new("Youtube", :videoid, :title, :date) #youtube_data = youtube.new("video_id","title","date") #mute = Mutex.new counter = 0 db_counter = 0 while id_list.size > 0 && counter < 20000 do counter += 1 threads = [] 10.times do |k| if id_list.size > 0 threads << Thread.new do #mute.synchronize do tempwork = id_list.shift if tempwork == nil next end target = "https://www.youtube.com/watch?v=" << tempwork[0][1..-2] id_title_list = work(target,words) if id_title_list != nil id_list.concat(id_title_list) end #end end end end threads.each(&:join) id_list.uniq! db.transaction do id_list.each_with_index {|data,num| if num == db_counter v_id = data[0] title = data[1].delete("\t\r\n") sth = db.prepare("insert into youtube (id,videoid,title) values(?,?,?)") sth.execute(db_counter,v_id,title) db_counter += 1 end } end puts id_list.size end </code></pre> <h4 id="Step 2"><a href="#Step+2">Step 2</a></h4> <pre><code class="ruby"># encoding: UTF-8 require 'net/http' require 'uri' require 'sqlite3' require 'time' require 'json' require 'nokogiri' # ./youtube__/youtube.db # #SQL =<<EOS #create table youtube ( # id INTEGER PRIMARY KEY AUTOINCREMENT, # videoid text, # chan_id text, # publ_id text, # title text # ); #EOS db = SQLite3::Database.open("./youtube__/youtube.db") def working(target,id_pack) puts target begin resp_0 = Net::HTTP.get_response(URI.parse(target)) rescue =>e puts e.message sleep 1 return nil end doc = Nokogiri::HTML.parse(resp_0.body, nil,'utf-8') #title_tag = doc.css('title') script_tag = doc.css('script') json_str = "" script_tag.each_with_index {|element,i| if i == 40 then json_str = element.to_s[58..-11] #<script nonce="fX_rKtuwcvo7T-wFeZz4CQ">var ytInitialData = end } doc = nil begin script40 = JSON.parse(json_str) rescue => e puts e return nil end ids = id_pack.new("videoid","publisheddate","channelid","title") script40.each {|y,x| if y.to_s == "contents" puts"-"*30 puts "URL: #{target}" ids.vi = target.sub("https://www.youtube.com/watch?v=","") match_date = x.to_s.match(/\"dateText\"=\>\{\"simpleText\"=\>\"(.{10})/) if match_date != nil ids.da = match_date[1] ch_id = $'.match(/\"browseId\"=\>\"(.*?)\",/) if ch_id != nil #puts "channelId: #{$1}" ids.ch = $1 end end match1 = x.to_s.match(/\{\"title\"=\>\{\"runs\"=\>\[\{\"text\"=\>\"(.*?)\"/) if match1 != nil # puts&quot;&quot; # puts&quot;-&quot;*30 #puts "title: #{$1}" ids.ti = $1 # puts $~ end end } #struct data return ids end threads = [] iiii = 0 mute = Mutex.new id_pack = Struct.new("Id_pack",:vi,:da,:ch,:ti) lastid = db.execute("SELECT id FROM youtube order by id DESC limit 1") db.execute("SELECT id,videoid FROM youtube").each do |videoid| row = videoid[1] num = videoid[0] puts "#{row} #{num}" str1 = row.gsub("\"","") if iiii < 10 && num < lastid[0][0] iiii += 1 threads << Thread.new do target = 'https://www.youtube.com/watch?v=' << str1 ids = working(target,id_pack) if ids != nil mute.synchronize do db.transaction do v_id = str1 date = ids.da chid = ids.ch title = ids.ti sth = db.prepare("update youtube set chan_id=?, publ_id=? where id=?") sth.execute(chid,date,num) end end end end else iiii = 0 target = 'https://www.youtube.com/watch?v=' << str1 ids = working(target,id_pack) if ids != nil mute.synchronize do db.transaction do v_id = str1 date = ids.da chid = ids.ch title = ids.ti sth = db.prepare("update youtube set chan_id=?, publ_id=? where id=?") sth.execute(chid,date,num) end end threads.each(&:join) end end end exit </code></pre> <p>Step 1 で ransomware というキーワードで検索して、タイトルのなかに ransomware という言葉が含まれる youtube 動画の videoId , title の情報が youtube というデータベースのテーブルに保存されます。</p> <p>Step 2 で タイトルのなかに ransomware という言葉が含まれる youtube 動画の youtube というデータベースのテーブルから読み出された youtubeId をもとに、channnel id , published された日付が youtube テーブルに追記されます。</p> <p><strong>youtube table</strong></p> <pre><code> id INTEGER PRIMARY KEY, videoid text, chan_id text, publ_id text, title text </code></pre> <p>こういうデータベースができあがるようになりました。<br /> タイトルと年月日時で、年代の古いものから並べるなどに使えるデータです。<br /> Step 1 , 2 は、ひとつにまとめることができますね。<br /> ひとつにまとめて、さらに動画の長さのデータもあればいいと思います。</p> <p>youtube での動画の長さは、</p> <pre><code>"duration": "PT4M13S" </code></pre> <p>というように埋め込まれているようです。<code>PT</code> から始まって分と秒で表されています。</p> <p><a target="_blank" rel="nofollow noopener" href="https://rentry.co/dyxuo">https://rentry.co/dyxuo</a></p> tomato tag:crieit.net,2005:PublicArticle/18306 2022-10-16T22:26:29+09:00 2022-11-19T11:55:11+09:00 https://crieit.net/posts/c2b7c645c32fda0b2cffd3aea91d6a01 グレートクソアルゴリズム <h1 id="アルゴリズムはチートされる 注目と広告、アテンション エコノミー / attention economy"><a href="#%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%AF%E3%83%81%E3%83%BC%E3%83%88%E3%81%95%E3%82%8C%E3%82%8B%E3%80%80%E6%B3%A8%E7%9B%AE%E3%81%A8%E5%BA%83%E5%91%8A%E3%80%81%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3+%E3%82%A8%E3%82%B3%E3%83%8E%E3%83%9F%E3%83%BC+%2F+attention+economy">アルゴリズムはチートされる 注目と広告、アテンション エコノミー / attention economy</a></h1> <p>それっぽいタイトルでありながら儲け話の記事じゃないよ。<br /> Youtube content ID と Mult-iChannel Networks についての内容です。<br /> <a href="https://crieit.now.sh/upload_images/9b203b0e01c417af299ec2f82f93eb656357508aa013f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/9b203b0e01c417af299ec2f82f93eb656357508aa013f.png?mw=700" alt="image" /></a><br /> <a target="_blank" rel="nofollow noopener" href="https://we.tl/t-1BtTeio0RG">https://we.tl/t-1BtTeio0RG</a></p> <p><code>vi_id</code> ... youtube <a target="_blank" rel="nofollow noopener" href="https://rentry.co/fpdf3">videoId</a><br /> <code>ch_id</code> ... youtuber <a target="_blank" rel="nofollow noopener" href="https://we.tl/t-Ga2IvD4mKi">channel id</a><br /> <code>pu_da</code> ... publishedDate</p> <p>"https://m.youtube.com/watch?v=/" + <a target="_blank" rel="nofollow noopener" href="https://rentry.co/fpdf3">videoId</a><br /> "https://m.youtube.com/channel/" + <a target="_blank" rel="nofollow noopener" href="https://we.tl/t-Ga2IvD4mKi">channelId</a></p> <pre><code> 1 vi_id:zvrsGCyPvF0 ch_id:UC0yQ2h4gQXmVUFWZSqlMVOA pu_da:2022-10-09 2 vi_id:Uq0TSMmc1Z8 ch_id:UC0yQ2h4gQXmVUFWZSqlMVOA pu_da:2022-10-07 3 vi_id:WsHHOrQ18Yk ch_id:UC0yQ2h4gQXmVUFWZSqlMVOA pu_da:2022-09-23 4 vi_id:sqbj63hrlHI ch_id:UC0yQ2h4gQXmVUFWZSqlMVOA pu_da:2022-09-17 5 vi_id:EFYZCv0aEIU ch_id:UC0yQ2h4gQXmVUFWZSqlMVOA pu_da:2022-09-08 6 vi_id:iGVULqpmiEE ch_id:UC0yQ2h4gQXmVUFWZSqlMVOA pu_da:2022-08-26 7 vi_id:FQU_ObSjDmc ch_id:UC0yQ2h4gQXmVUFWZSqlMVOA pu_da:2022-08-16 8 vi_id:GAkZEQglk3k ch_id:UC0yQ2h4gQXmVUFWZSqlMVOA pu_da:2022-08-06 9 vi_id:IW3et-CxvC4 ch_id:UC0yQ2h4gQXmVUFWZSqlMVOA pu_da:2022-08-04 10 vi_id:D9OeuTyzMLE ch_id:UC0yQ2h4gQXmVUFWZSqlMVOA pu_da:2022-07-29 </code></pre> <p>ファイルはテキストファイルで、<code>;</code> で区切って三項目並べています。</p> <p><a href="https://crieit.now.sh/upload_images/c7678b959f9a21d729495933ca2e6eb3635bda0f5ed31.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/c7678b959f9a21d729495933ca2e6eb3635bda0f5ed31.png?mw=700" alt="関連するyoutube チャンネル数の比較" /></a></p> <p><a target="_blank" rel="nofollow noopener" href="https://we.tl/t-dHlu1z0fR9">https://we.tl/t-dHlu1z0fR9</a></p> <p>2022 時点で関係する youtube channel リスト 18,786 の youtube videoid から調べ</p> <p><a target="_blank" rel="nofollow noopener" href="https://rentry.co/p427u">https://rentry.co/p427u</a></p> <hr /> <p><a href="https://crieit.now.sh/upload_images/68fd363b94aeace56076a422a5a49d6d634cd5d74aac2.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/68fd363b94aeace56076a422a5a49d6d634cd5d74aac2.png?mw=700" alt="image" /></a></p> <h2 id="狂ったアルゴリズムはチートされる"><a href="#%E7%8B%82%E3%81%A3%E3%81%9F%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%AF%E3%83%81%E3%83%BC%E3%83%88%E3%81%95%E3%82%8C%E3%82%8B">狂ったアルゴリズムはチートされる</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://crieit-net.translate.goog/posts/c2b7c645c32fda0b2cffd3aea91d6a01?_x_tr_sl=auto&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp">transrate to</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://youtu.be/sr1KscMfBOY">recommendation system</a> というのか、普通に <strong>カスタムされていない chrome ブラウザ</strong> などで、例えば日経テレ東の youtube channel にある、<a target="_blank" rel="nofollow noopener" href="https://www-wired-com.translate.goog/story/who-owns-4chan/?_x_tr_sl=en&_x_tr_tl=ja&_x_tr_hl=ja&_x_tr_pto=wapp">西村博之</a>と<a target="_blank" rel="nofollow noopener" href="https://twitter.com/uekky/status/1575768726812909569?s=20&t=oMNAPMiMa2vZc8_S6ZYL1Q">成田某</a>の番組の映像のサムネイルをクリックすると、そのあとからは、ブラウザのなかに表示されるものは、<a target="_blank" rel="nofollow noopener" href="https://archive.ph/Iez0A">日経テレ東 channel</a> のサムネイルがついたクリップがウィンドウの 50 % くらいを独占するようになる。</p> <p><a target="_blank" rel="nofollow noopener" href="https://0bin.net/paste/ZnM8373E#91HmGyP3HDSCC2nvf0riIhEzGwZ6uv72BW1+3c1JNRc">関連 youtube URL リスト 2007 本</a></p> <p>cf. 以下の条件では結果が変わるかもしれません。<br /> <a target="_blank" rel="nofollow noopener" href="https://en.m.wikipedia.org/wiki/Brave_%28web_browser%29">https://en.m.wikipedia.org/wiki/Brave_%28web_browser%29</a><br /> <a target="_blank" rel="nofollow noopener" href="https://en.m.wikipedia.org/wiki/DuckDuckGo">https://en.m.wikipedia.org/wiki/DuckDuckGo</a><br /> <a target="_blank" rel="nofollow noopener" href="https://en.m.wikipedia.org/wiki/NewPipe">https://en.m.wikipedia.org/wiki/NewPipe</a><br /> Vanced is discontinued but ReVanced is here - HOW to install<br /> <a target="_blank" rel="nofollow noopener" href="https://youtu.be/mU4M2m_cL7g">https://youtu.be/mU4M2m_cL7g</a><br /> <a target="_blank" rel="nofollow noopener" href="https://github.com/pi-hole/pi-hole">https://github.com/pi-hole/pi-hole</a></p> <p>これを、Youtube からの自動の推薦、つまり、<a target="_blank" rel="nofollow noopener" href="https://blog.youtube/inside-youtube/on-youtubes-recommendation-system/">youtube recommendation system</a> と呼ぶことにして、その推薦するクリップの判定アルゴリズムが狂ってるなと思っている(個人の感想ですよ)というか<a target="_blank" rel="nofollow noopener" href="https://rentry.co/zuprc">クソ</a>。踏んだら(クリックしたら)、ずっと(関連動画を薦める個人属性が)くっついてしまうので、その後の検索でも検索したい内容と無関係に分析された属性によって薦めてくる見たくない動画内容が半分まぎれて、集中が拡散される作りになっている。</p> <p>rf.<br /> Collaborative_filtering<br /> <a target="_blank" rel="nofollow noopener" href="https://en.m.wikipedia.org/wiki/Collaborative_filtering">https://en.m.wikipedia.org/wiki/Collaborative_filtering</a></p> <h3 id="youtube recommendation system"><a href="#youtube+recommendation+system">youtube recommendation system</a></h3> <p><strong>機械学習に使うポイントの付け方とか、合理的に機械的に評価しているようでいて、単純にすべてがバグってる</strong> としか思えない(個人の感想ですよ)。<br /> 関連の動画を排除しようとすると表示されている動画のサムネイルに対して一つづつ「興味がないために非表示にする」を選んで閉じていかないといけないというわけ。</p> <blockquote> <p>Hated that video? YouTube’s algorithm might push you another just like it.<br /> New research from Mozilla shows that user controls have little effect on which videos YouTube’s influential AI recommends.<br /> By Hana Kirosarchive page<br /> September 20, 2022<br /> <a target="_blank" rel="nofollow noopener" href="https://www.technologyreview.com/2022/09/20/1059709/youtube-algorithm-recommendations/">https://www.technologyreview.com/2022/09/20/1059709/youtube-algorithm-recommendations/</a></p> </blockquote> <hr /> <blockquote> <p>Does this button work?<br /> Investigating YouTube’s ineffective user controls<br /> <a target="_blank" rel="nofollow noopener" href="https://foundation.mozilla.org/en/youtube/user-controls/">https://foundation.mozilla.org/en/youtube/user-controls/</a></p> </blockquote> <hr /> <p>単純に、ユーザーのためのアルゴリズムではなくてプラットフォームの方向性にそくしたアルゴリズムだからといえばそれまでだ。要するに、知りたい見つけたいものを探す動機のあるユーザーに対して、その道中にお菓子を置いてみたり、エロ本を置いてみたりして集中を乱してザッピングさせるようなアルゴリズムだ。そんなの要らないというものがずっと消えないで残ると、モチベーションが拡散されていく。</p> <p>このバグのように悪夢的な的外れの youtube recommendation system について、<a target="_blank" rel="nofollow noopener" href="https://desuarchive.org/qa/chunk/706294/">アメリカのインターネットの匿名掲示板</a>のオーナーである人物は、このバグみたいな関連動画をオススメするアルゴリズムは、このアルゴリズムの特性を利用してチート可能と確信して、Youtube によって設定されたアルゴリズムを活用して、広告収入をより多く得れるように場を設定するように<a target="_blank" rel="nofollow noopener" href="https://getnews.jp/mcn/kirinuki">実践</a>したのだろう。<br /> <a target="_blank" rel="nofollow noopener" href="https://search.brave.com/search?q=切り抜き動画&source=android">あんまり遠回しに表現しすぎると意味わからない ?</a></p> <p>rf.<br /> Bibliotheca Anonoma<br /> <a target="_blank" rel="nofollow noopener" href="https://imgur.com/a/9ggNCFl">https://wiki.bibanon.org/4chan/History</a><br /> アノニマス BBS プログラムの系譜をまとめていく<br /> <a href="https://crieit.net/posts/BBS">https://crieit.net/posts/BBS</a></p> <h3 id="広告収入をより多く得れるように場を設定"><a href="#%E5%BA%83%E5%91%8A%E5%8F%8E%E5%85%A5%E3%82%92%E3%82%88%E3%82%8A%E5%A4%9A%E3%81%8F%E5%BE%97%E3%82%8C%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E5%A0%B4%E3%82%92%E8%A8%AD%E5%AE%9A">広告収入をより多く得れるように場を設定</a></h3> <h4 id="チーティング ?"><a href="#%E3%83%81%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0+%EF%BC%9F">チーティング ?</a></h4> <blockquote> <p>"<strong>ユーザーの Youtube 視聴画面全部を自分の関連動画のサムネイルで埋め尽くし、オススメに自分の関連するものばかりを設定する</strong> という目的を達成するには、自分以外に自分が配信した <a target="_blank" rel="nofollow noopener" href="https://gigazine.net/news/20220624-yt-dlp-download-sections/">youtube 映像からコピーコンテンツを作れる</a>ひとが、<strong>どんどんコピー動画を作りコンテンツの量を増し</strong> て、それを youtube へアップしていけば、より楽に自分の関連コンテンツが溢れかえる。<br /> あとは、狂った youtube recommendation system が、ユーザーが一度でもそれら関連動画へのリンクをクリックすれば、ずっとそれら関連動画をユーザーに薦め続ける。<br /> まるで malware に感染したみたいに、ソフトに逃げられない動線を張り巡らされてしまうのだ。<br /> 自分では編集せず、うまく見やすく編集したものか、偶然でも何でもいいけど、再生回数が上がったものから、売り上げを上納してもらえる仕組みをつくればいい"</p> </blockquote> <p>と考えてみる(個人の意見です)。</p> <h3 id="Multi Channel Networks ( MCNs )"><a href="#Multi+Channel+Networks+%28+MCNs+%29">Multi Channel Networks ( MCNs )</a></h3> <p>そして、そのためには、コピーコンテンツを <strong>テイクダウン</strong>(ノーティスアンドテイクダウン)するライセンスを持てばいい。<br /> そうすると、コピー動画の配信から視聴された回数分の広告収入を自分に流入させれる、ということで、そういった権限のライセンス( <a target="_blank" rel="nofollow noopener" href="https://support.google.com/youtube/answer/2797370?hl=ja">youtube content ID</a>を管理できる )を特権として持った企業として、いくつかの会社がある。</p> <p>rf.<br /> * Hololive Production (Japan)<br /> * Nijisanji (Japan)<br /> * <a target="_blank" rel="nofollow noopener" href="https://www.uuum.co.jp/2022/11/10/88263">uuum (Japan)</a><br /> <a target="_blank" rel="nofollow noopener" href="https://en.m.wikipedia.org/wiki/List_of_multi-channel_networks">https://en.m.wikipedia.org/wiki/List_of_multi-channel_networks</a></p> <p>この業態を <a target="_blank" rel="nofollow noopener" href="https://scholar.google.co.jp/scholar?q=Multi+Channel+Networks&hl=en&as_sdt=0&as_vis=1&oi=scholart">Multi Channel Networks</a> という。<br /> MCNs の周辺の動態を調べている研究によると、MCNs と手を組まなくてはならない理由として、脱税と身元隠しが主要な理由としてあるらしい。</p> <p>rf.<br /> <a target="_blank" rel="nofollow noopener" href="https://www.google.com/search?q=Behind+the+Tube:+Exploitative+Monetization+of+Content+on+YouTube&sourceid=chrome-mobile&ie=UTF-8">Behind the Tube: Exploitative Monetization of Content on YouTube</a><br /> Andrew Chu, Arjun Arunasalam, Muslum Ozgur Ozmen and Z. Berkay Celik<br /> 日本語解説記事<br /> <a target="_blank" rel="nofollow noopener" href="https://www.itmedia.co.jp/news/articles/2208/17/news061_3.html">https://www.itmedia.co.jp/news/articles/2208/17/news061_3.html</a></p> <blockquote> <p><a href="https://crieit.now.sh/upload_images/84fa6c621192b78e5aceccb25def6621634cd2be15bf9.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/84fa6c621192b78e5aceccb25def6621634cd2be15bf9.png?mw=700" alt="image" /></a><br /> <a href="https://crieit.now.sh/upload_images/de8f3deb6167aaec0dfdd648062e2c3e634cd6d0ef5cf.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/de8f3deb6167aaec0dfdd648062e2c3e634cd6d0ef5cf.png?mw=700" alt="image" /></a><br /> YouTube Multi-Channel Networks - Broughy Explains ( 2016 Aug 9 )<br /> <a target="_blank" rel="nofollow noopener" href="https://youtu.be/MpYqxDxlKUw?t=141">https://youtu.be/MpYqxDxlKUw?t=141</a></p> </blockquote> <p>要するに google との契約で Youtuber とダイレクトにすんでしまう関係を、わざわざ MCNs と契約して google からの広告収入をダイレクト受け取らない理由は、そのモチベーションと重なるということになる。簡単に言うと、どーしても google と直接契約したくはないか、できない理由がある場合は、そうするよね。もちろん、儲かるしかけを設定できるならば、だが。</p> <p>これを踏まえて、コピー動画をつくって再生回数をあげれるというクラスターが MCNs にぶら下がって収益を得る、その仕組みが具現化したのが、切り抜き動画群なわけだ。</p> <p>それを支えるのがクラスターを作り出す中間の右から左へコンテンツを納品していく業者で、おそらく労働市場(副業というラベルになっている)で、マッチングした実作業労働者がいるのだろう。たぶん。<br /> 例えば、クラウドワークスにアカウントつくって覗いてみると、なーんだこれーという動画編集丸投げ案件が(よく)ある。</p> <h3 id="アテンションを加熱させるためのヘイトへのエスカレーション"><a href="#%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E5%8A%A0%E7%86%B1%E3%81%95%E3%81%9B%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E3%83%98%E3%82%A4%E3%83%88%E3%81%B8%E3%81%AE%E3%82%A8%E3%82%B9%E3%82%AB%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3">アテンションを加熱させるためのヘイトへのエスカレーション</a></h3> <p>こういったエコシステムの弊害で、より多くのアテンションを稼ぎだすためだけにエクストリームな表現、アジテーシーションがエスカレーションして、よりリアクションに熱気がでる<a target="_blank" rel="nofollow noopener" href="https://archive.ph/ecNdR">ヘイト</a>よりな言動が産み出されていく。</p> <p>Youtube では人間を使ったクレーム対応に日本語を理解する人間が関わっているのいるのかどうかはかなり疑問がある。{ 遠回しな表現 }</p> <p>Youtube プラットフォーム上での<strong>コンテンツの内容について倫理規定はどこまでもグレーゾーン</strong>であるわけで、コンテンツによって収益を得ようとする youtuber は youtube が裁定する倫理違反かどうかのジャッジの境界を探りつつも、より強い<a target="_blank" rel="nofollow noopener" href="https://archive.ph/dgjSV">ヘイト</a>を内包するゴシップに増長していく傾向がある。</p> <p><a target="_blank" rel="nofollow noopener" href="https://archive.ph/ecNdR">ひろゆき氏「沖縄の人って文法通りしゃべれない」 県民の“日本語”めぐり発言<br /> 2022年10月12日 05:47</a></p> <p>有限会社未来検索ブラジル 元社長の考察 2022/9/7<br /> <a target="_blank" rel="nofollow noopener" href="https://otakei.otakuma.net/archives/2022090706.html">https://otakei.otakuma.net/archives/2022090706.html</a></p> <p>4 つの Responsibility( 責任): Remove、 違反コンテンツの削除<br /> 2019年9月12日木曜日<br /> <a target="_blank" rel="nofollow noopener" href="https://youtube-jp.googleblog.com/2019/09/4-responsibility-remove.html">https://youtube-jp.googleblog.com/2019/09/4-responsibility-remove.html</a><br /> <a target="_blank" rel="nofollow noopener" href="https://support.google.com/youtube/answer/2801939?hl=ja&ref_topic=9282436">ヘイトスピーチに関するポリシー</a></p> <p>切り●き動画を推奨して、たくさんの亜種を増殖させたいインフルエンサーは、やや微妙な表現で匂わせるコントラバーシャルな言動を使うが、そこから派生していく亜種は、そういった表現の部分を拾い上げて全面に押し出して、●●す等のように●●字で●●たテロップをつけたサムネイルで人の関心をひこうとすることで、結果としてボーダーライン上のハラスメントの増長をひき起こしている。</p> <p>ただ、あんまり過激に、興味をひくだけのために社会的問題になったり、はっきりした分断を助長する行為と、広告を出さなければならない企業の狙いとは相容れない。</p> <p>ある程度までそのモラルハザード越えたと思われるコンテンツが増えると、インフルエンサーのイメージがポイズニングされる。<br /> 派生した亜種の増殖によって、<strong>好感度も、その逆も、溢れかえるイメージによってコントロールされている</strong> わけなのだから。</p> <hr /> <p>【RTメモ】Qアノン、2ch、5ch、そして8ch<br /> <a target="_blank" rel="nofollow noopener" href="https://archive.ph/oCoOU">https://min.togetter.com/wP0Vo8e</a></p> <hr /> <p><a target="_blank" rel="nofollow noopener" href="https://0bin.net/paste/sPziOoyi#n45IhTUESxjneejIsBddo+a-B/KAwMS5m2lJa/MPgFo">youtube URL list 750 個</a></p> <p><a href="https://crieit.net/posts/6-111">youtube 上に関連動画は、6,111 個見つかった。</a></p> <pre><code class="pyton"># coding: UTF-8 import urllib.request import urllib.parse import re import time words = "ひろゆき" keywords = urllib.parse.quote(words) target = "https://www.youtube.com/results?search_query=" + str(keywords) video_list_0 = [] already_list = [] total_list = [] id_cell = {} video_list_0.append(target) def first_gether(target_url,total_list,id_cell): html = urllib.request.urlopen(target_url).read() html_strings = html.decode() del(html) video_list = [] title = re.search(r'(?<=\<title\>).*?(?=\</title\>)',html_strings) if title is None: kakawari = re.search(r'ひろゆき|hiroyuki|西村博',html_strings) if kakawari is None: pass else: video_ids = re.findall(r"watch\?v=(.{11})", html_strings) # video_ids = re.findall(r&quot;watch\?v=(\S{11})&quot;, html_strings) id_data = list(set(video_ids)) del(video_ids) video_list = ["https://www.youtube.com/watch\?v=" + str(x) for x in id_data] del(id_data) else: title_strings = title.group() del(title) kakawari2 = re.search(r'ひろゆき|hiroyuki|西村博',title_strings) if kakawari2 is None: # print(title_strings) # print('@@@') pass else: # total_list.append(target_url) idxxx = target_url.replace("https://www.youtube.com/watch\?v=","") print("----------------") print(idxxx) id_cell[idxxx] = title_strings print('!!!',title_strings) print('@@@',target_url) video_ids = re.findall(r"watch\?v=(.{11})", html_strings) # video_ids = re.findall(r&quot;watch\?v=(\S{11})&quot;, html_strings) id_data = sorted(list(set(video_ids)),key=video_ids.index) del(video_ids) video_list = ["https://www.youtube.com/watch\?v=" + str(x) for x in id_data] del(id_data) return video_list,total_list,id_cell def second_gether(counter_x,url_list,already_list,total_list,id_cell): if len(url_list) > 0: sum_list = [] rem = [] for i,url in enumerate(url_list): if not re.match(r'^https',url): continue if url in already_list: print("----------------") print(counter_x,';',(i + 1),';',"skip") rem.append(url) continue print("----------------") print(counter_x,';',(i + 1),';',url) try: video_list,total_list,id_cell = first_gether(url,total_list,id_cell) except: time.sleep(1) continue already_list.append(url) if (len(video_list) > 0): sum_list.extend(video_list) total_list = list(set(total_list)) if (len(rem) > 0) : for remove in rem: if remove in sum_list: inum = sum_list.index(remove) sum_list.pop(inum) next_list = sorted(list(set(sum_list)),key=sum_list.index) counter_x = counter_x + 1 if(counter_x < 5): video_list,already_list,total_list,id_cell = second_gether(counter_x,next_list,already_list,total_list,id_cell) return video_list,already_list,total_list,id_cell x = 0 video_list_0,already_list,total_list,id_cell = second_gether(x,video_list_0,already_list,total_list,id_cell) del(video_list_0,already_list) #for ind,allurl in enumerate(total_list): # print(ind,allurl) i = 0 for k,v in id_cell.items(): i = i + 1 print(i,' id:',k,' title:',v) print("----------------") exit() </code></pre> <p><a target="_blank" rel="nofollow noopener" href="https://rentry.co/gxu3a/raw">https://rentry.co/gxu3a/raw</a></p> <pre><code class="perl">use strict; use warnings; use utf8; use HTML::HTML5::Parser; use XML::LibXML::QuerySelector; binmode STDOUT,":utf8"; use Encode; #use Data::Dumper; my $keywords = qr/ひろゆき/; my $useragent = "'User-Agent: Mozilla/5.0 (Linux; Android 9) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36'"; my $filename1 = $ARGV[0]; open(my $fh0, '<:encoding(UTF-8)', $filenamer1) or die "Could not open file '$filename1' $!"; while (my $row = <$fh0>) { if ($row =~ m/^\n/){ next; } if ($row =~ m/skip/){ next; } chomp $row; my $url = $row; undef($row); my $syscom = qx{curl -sLH $useragent "$url"}; my $mybody = Encode::decode('UTF-8',$syscom); #my $mybody = Encode::decode('shift-jis',$syscom); my $parser = new HTML::HTML5::Parser; my $doc = $parser->parse_string( $mybody,{ encoding => 'utf-8'}); #my $doc = $parser->parse_string( $mybody ); undef($mybody); my @nodelist = $doc->querySelectorAll('title'); foreach(@nodelist){ my $str = $_->textContent; if ( $str =~ $keywords){ print $url."\n"; last; }else{ } } } close($fh0); </code></pre> tomato