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 "-"*20
# puts "#{ind} https://www.youtube.com./watch?v=#{content[1..-2]}"
# 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 "-"*20
# puts "no title found"
# puts "#{ind} https://www.youtube.com./watch?v=#{content[1..-2]}"
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 "-"*20
# puts "#{ind} https://www.youtube.com./watch?v=#{content[1..-2]}"
# 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 "-"*20
# puts "no title found"
# puts "#{ind} https://www.youtube.com./watch?v=#{content[1..-2]}"
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""
# puts"-"*30
# puts $1
# puts $~
# puts"-"*30
tempstrings = $'
while tempstrings.match(/\"title\"=\>\{\"accessibility\"=\>\{\"accessibilityData\"=\>\{\"label\"=\>"(.*?)\"\}\},/) do
if $0 == nil
break
end
# puts" _"*20
# puts""
# puts $1
tempstrings = $'
videotitle_list2.push($1)
match_videoid = /\"commandMetadata\"=\>\{\"webCommandMetadata\"=\>\{\"url\"=\>\"\/watch\?v=(.{11}\"),/ =~ $'
if match_videoid != nil
# puts ("\"" + $1)
videoid_list2.push("\"" + $1)
end
end
else
# puts "-"*30
# puts y x
# puts "can't find the title"
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 "-"*30
# puts "error"
# puts ind,content
# puts "https://www.youtube.com./watch?v=#{content[1..-2]}"
# puts "-"*30
next
end
mmmm = videotitle_list2[ind].match(/#{words}/i)
if mmmm == nil
# puts "-"*30
# puts ind,content
# puts videotitle_list2[ind]
# puts "skip"
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 "#{ind}: #{list[0]}"
# puts "#{ind}: #{list[1]}"
# 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""
# puts"-"*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"watch\?v=(\S{11})", 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"watch\?v=(\S{11})", 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