-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
532 lines (411 loc) · 20.9 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
<!doctype html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Twitter's ranking algorithm is irretrievably flawed</title>
<meta name="description" content="Twitter's ranking algorithm is irretrievably flawed">
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<meta name="twitter:card" content="summary" />
<meta name="twitter:creator" content="@TolstoyDotCom" />
<meta name="twitter:url" content="https://tolstoydotcom.github.io/twitter-ranking-algorithm/" />
<meta name="twitter:title" content="Twitter's ranking algorithm is irretrievably flawed" />
<meta name="twitter:description" content="See these examples." />
<meta name="twitter:image" content="https://tolstoydotcom.github.io/twitter-ranking-algorithm/censorship.jpg" />
<link rel="stylesheet" href="css/sortable-theme-bootstrap.css" />
<link rel="stylesheet" href="css/sortable-theme-light.css" />
<style>
/* Prism.js */
code[class*="language-"], pre[class*="language-"] {color: black; font-family: Consolas, Monaco, 'Andale Mono', monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } /* Code blocks */ pre[class*="language-"] {padding: 1em; margin: .5em 0; overflow: auto; font-size: 14px; } :not(pre) > code[class*="language-"], pre[class*="language-"] {background: rgba(0, 0, 0, .05); } /* Inline code */ :not(pre) > code[class*="language-"] {padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata {color: slategray; } .token.punctuation {color: #999; } .namespace {opacity: .7; } .token.property, .token.tag, .token.boolean, .token.number, .token.constant, .token.symbol {color: #905; } .token.selector, .token.attr-name, .token.string, .token.builtin {color: #690; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string, .token.variable {color: #a67f59; } .token.atrule, .token.attr-value, .token.keyword {color: #07a; } .token.regex, .token.important {color: #e90; } .token.important {font-weight: bold; } .token.entity {cursor: help; }
html, body {
height: 100%;
}
body {
margin: 0;
font-family: "proxima-nova", "Helvetica Neue", sans-serif;
}
table.showcase {
height: 100%;
width: 100%;
position: relative;
}
table.showcase .showcase-inner {
margin: 40px auto 60px;
padding: 10px;
}
table.showcase:after {
content: "";
display: block;
position: absolute;
opacity: 0.5;
left: 0;
right: 0;
bottom: 20px;
margin: auto;
height: 0;
width: 0;
border-width: 18px;
border-style: solid;
border-color: transparent;
border-top-color: inherit;
}
table.showcase.last-showcase:after {
display: none;
}
table.showcase .showcase-inner h1 {
font-size: 50px;
text-align: center;
font-weight: 300;
}
table.showcase .showcase-inner h2 {
font-size: 24px;
text-align: center;
font-weight: 300;
margin: 1em 0 1em;
padding: 0 10%;
}
table.showcase .showcase-inner p {
text-align: center;
}
.button {
display: inline-block;
border: 2px solid #fff;
color: #fff;
padding: 1em 1.25em;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 3px;
text-decoration: none;
cursor: pointer;
width: 140px;
font-size: .8em;
line-height: 1.3em;
}
.button.dark {
background: #fff;
color: #0bab74;
}
table.showcase.hero {
background: #14c589;
color: #fff;
}
table.showcase.hero h1,
table.showcase.hero h2 {
color: #fff
}
table.showcase.hero:after {
border-top-color: #fff
}
table.showcase.hero table[data-sortable].sortable-theme-bootstrap {
font-family: inherit;
font-size: 16px;
}
table.showcase.hero table[data-sortable].sortable-theme-bootstrap th[data-sorted="true"] {
color: #0daf77;
background: #b8f1dd;
border-bottom-color: #22bd88;
}
table.showcase .showcase-inner table[data-sortable] {
margin: 4em auto 3em;
}
table.showcase.hero .showcase-inner table[data-sortable] {
margin-bottom: 1em;
}
table.showcase .showcase-inner p.source {
color: rgba(255, 255, 255, .7);
font-weight: 300;
letter-spacing: .01em;
text-align: center;
font-size: 12px;
margin: 0 0 3em;
padding: 0 20%;
}
table.showcase .showcase-inner p.source a {
color: inherit;
}
@media (max-width: 786px) {
table.showcase .showcase-inner table[data-sortable] tr *:nth-child(4) {
display: none;
}
table.showcase .button.dark {
display: none;
}
}
@media (max-width: 480px) {
table.showcase .showcase-inner table[data-sortable] tr *:nth-child(3) {
display: none;
}
}
table.showcase.about {
background: #fff1dd;
}
table.showcase.about {
background: #fff1dd;
}
table.showcase.about a {
color: #c96c24;
}
table.showcase.about p > code {
background: rgba(0, 0, 0, .05);
}
table.showcase.about p,
table.showcase.about pre {
text-align: left;
width: 500px;
max-width: 100%;
margin-left: auto;
margin-right: auto;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
@media (max-width: 568px) {
table.showcase.about p,
table.showcase.about pre {
width: 400px;
}
}
@media (max-width: 420px) {
table.showcase.about p,
table.showcase.about pre {
width: 280px;
}
}
table.showcase.themes {
background: #eee;
}
table.showcase.themes.sortable-theme-minimal {
background: #fff;
}
table.showcase.themes.sortable-theme-light {
background: #f8f8f8;
}
table.showcase.themes.sortable-theme-dark {
background: #323232;
}
table.showcase.themes.sortable-theme-bootstrap {
background: #f2f8ff;
}
table.showcase.themes.sortable-theme-dark h1,
table.showcase.themes.sortable-theme-dark h2,
table.showcase.themes.sortable-theme-dark p {
color: #e6e6e6;
}
table.showcase.themes .themes-list {
margin: 4em auto;
padding: 0;
list-style: none;
text-align: center;
font-size: 18px;
}
table.showcase.themes .themes-list li {
padding: 0;
margin: 0;
display: inline;
}
table.showcase.themes .themes-list li a {
cursor: pointer;
opacity: 0.3;
padding: .5em;
display: inline-block;
}
table.showcase.themes .themes-list li a.selected {
opacity: 1;
}
table.showcase.themes.sortable-theme-dark .themes-list li a {
color: #fff;
}
#intro {
margin-left:auto;
margin-right:auto;
width:70%;
padding: 10px;
}
div {
width:80%;
margin-left:auto;
margin-right:auto;
margin-top:1rem;
margin-bottom:1rem;
}
img {
margin-left:20rem;
border:2px solid black;
}
h1 {
text-align:center;
margin-bottom:2rem;
}
</style>
</head>
<body>
<h1>Twitter's ranking algorithm is beyond flawed</h1>
<div>
Twitter's ranking algorithm is irretrievably flawed when it comes to controversial topics like politics. That algorithm determines which tweets you see and in which order, and it consistently promotes low quality tweets while usually suppressing higher quality tweets.
</div>
<div>
For a tangible example, consider this from GovNedLamont/status/1643011987356393472:
</div>
<img src="GovNedLamont_040323.png"/>
<div>
That's on a cutesy thread where the governors of CT and CA wager on a sports game. Whether you agree with the last tweet in the image or not, you have to admit that it's higher quality than the tweets above. Yet, the Twitter ranking algorithm thinks the first three are better: it calls those "HighQuality" and the last tweet "LowQuality". In fact, the Twitter algorithm hid the last tweet: I had to click the 'Show more replies' link to see it.
</div>
<div>
Does that make any sense? Shouldn't the algorithm have ranked the last tweet above the other three?
</div>
<div>
If you look at reply threads you'll see this over and over. For instance, here are two "HighQuality" replies on GavinNewsom/status/1643066244982030339:
</div>
<img src="GavinNewsom_040323.png"/>
<div>
The first tweet has nothing to do with the Newsom tweet it's a reply to and I've seen that image dozens of times before. The last tweet is from a pro-Newsom activist and "human bot": he appears to be a real person but he never really says anything. Despite that, his replies are invariably near the top of Newsom's replies.
</div>
<div>
Here's another case from BrianDahleCA/status/1642989102051229696 (BrianDahleCA/status/1641590521297780736 is similar but has 100s of replies):
</div>
<img src="BrianDahleCA_040323.png"/>
<div>
For an explanation, see "Adults led a pet goat to slaughter to teach girl a lesson. All she learned was cruelty | Opinion" (<em>"The only authority figure who comes off looking decent in this whole affair is Republican state Sen. Brian Dahle, who bought the goat at auction and then agreed to let it live"</em>). Whatever the facts of that matter, there are much more important things to hold Dahle accountable over. Yet, Twitter is preventing that by elevating goat-related replies above all others. That's like elevating dozens of "me too" comments above those with actual content.
</div>
<div>
To be clear, I only use Twitter to try to hold leaders accountable. If you use Twitter to discuss BTS or similar the ranking algorithm might work OK. The Youtube recommendation algorithm works fairly well for music and, even though Google is much (much, much) more technically competent than Twitter, Twitter might work OK if you're only there for music or sports.
</div>
<div>
However, politics and other controversial topics are a different beast. Twitter elevates those who tell others what they want to hear and who avoid challenging others. However, those who are in the habit of showing others wrong are likely to be blocked and reported, resulting in Twitter silencing them. Even Elon Musk admitted that blocks can be used to silence dissent, but, obviously, he hasn't done anything about that.
</div>
<div>
For hundreds of other examples of how flawed the Twitter algorithm is, see these <a href="https://tolstoy.com/twittercensorship/">Twitter censorship reports</a>.
</div>
<div>
<strong>4/4/23</strong>: These are from the "AbusiveQuality" section on JenSiebelNewsom/status/1643446471348584448. That's the doubleplus censored section after 'show more replies'.
Apparently Twitter considers "good grief" to be a forbidden swear. Anyone who's so emotionally fragile that they need to be protected from such language should be institutionalized.
</div>
<img src="JenSiebelNewsom_abusivequality_040423.png"/>
<div>
<strong>4/8/23</strong>: These are from the replies to ConwayShow/status/1644394938204057605; the tweet is an image of Egyptian hieroglyphics vs emojis, with the text "4000 years and we're back to the same language".
Twitter declares the first tweets in the image to be "HighQuality", but they call the last tweet "AbusiveQuality". Does that make sense to anyone? (The tooltips for the "O.J." emojis are "Hocho" and "Drop of blood", the one for the last is "Call me hand").
</div>
<img src="ConwayShow_040823.png"/>
<div>
<strong>4/10/23</strong>: These are from the replies to RickCarusoLA/status/1580016999010553857 (from 10/12/22, <em>"Angelenos need honest leaders who work together to solve big problems like crime, homelessness, and housing. Our city deserves better than more of the same from a fundamentally broken system."</em>).
Unlike the other images, this was when not logged in.
Twitter declares the first two tweets in the image to be "HighQuality", but they call the last two tweets "LowQuality". Does that make sense?
</div>
<img src="RickCarusoLA_101222.png"/>
<div>
<strong>4/10/23</strong>: The next two images are from the replies to JesseBWatters/status/1645578168995135489 (<em>"We give our military almost a trillion dollars a year so where does it go? Well, the Pentagon has no idea. They told the IRS they couldn’t account for over 60% of their assets. Every single time the military gets audited, they fail with flying colors."</em>).
Both were while logged in.
These replies are from the "HighQuality" section:
</div>
<img src="JesseBWatters_041023_high.png"/>
<div>
And, these replies are from the "LowQuality" section:
</div>
<img src="JesseBWatters_041023_low.png"/>
<div>
<strong>4/11/23</strong>: These are the first three replies to GavinNewsom/status/1645898328373116931 (<em>"This is a serious moment in America's history. We're seeing an all out assault on civil rights, voting rights, LGBT rights, women's rights -- all the progress we have made in the last half century is being rolled back in state after state."</em>).
This was while logged in.
Twitter calls these "HighQuality" and, since they're first, they're what Twitter thinks of as the highest quality replies. Not to repeat myself, but does that make sense to anyone?
</div>
<img src="GavinNewsom_041123.png"/>
<div>
<strong>4/11/23</strong>: This the first reply to IngrahamAngle/status/1645969226228793345 (while logged in). Agree or disagree, she's making a wonky point about economics.
Twitter thinks the highest-quality reply is a childish tweet that has nothing to do with her point. Does <strong>anyone</strong> think a childish ad hominem GIF is "HighQuality"?
</div>
<img src="IngrahamAngle_041123.png"/>
<div>
<strong>4/12/23</strong>: These are the first three replies to CAgovernor/status/1645909108208586753 (<em>"Americans want California’s gas price gouging law. 7 out of 10 voters nationwide support limiting oil company profits and requiring these companies to open their books – just like our new law to hold Big Oil accountable."</em>, while logged in).
Twitter calls a childlike suggestion that Newsom resign and two people tweeting the same image "HighQuality".
</div>
<img src="CAgovernor_041223.png"/>
<div>
<strong>4/13/23</strong>: These are the first three censored replies to MayorOfLA/status/1646599931921334272 (<em>"Honored to join the @ClimateMayors Steering Committee as L.A. recommits to take bold action that centers jobs and climate justice for communities that have been impacted by climate change for too long. This group of city leaders is ready to advance a clean energy future for all."</em>, while logged in).
The "HighQuality" replies aren't that bad, but one wonders what led Twitter to call these replies "LowQuality" (aside from Twitter's gross incompetence, of course).
</div>
<img src="MayorOfLA_041323.png"/>
<div>
<strong>4/16/23</strong>: These are from LAGalaxy/status/1647726507975139328 (announcing a goal by their cross-town rivals LAFC).
Can anyone from Twitter explain why some are called "HighQuality" and the others "LowQuality"?.
</div>
<img src="LAGalaxy_041623.png"/>
<div>
<strong>4/16/23</strong>: Of the three replies to ConwayShow/status/1647264805567496192 (a video-only tweet), two were called "HighQuality" and this one was called "LowQuality".
"Ding Dong" is Conway's signature saying.
</div>
<img src="ConwayShow_041623.png"/>
<div>
<strong>4/17/23</strong>: These are the first two replies to CAgovernor/status/1648115085079093248 (<em>"California has secured an emergency stockpile of Misoprostol to ensure people can access medication abortion in California regardless of what happens in the courts. We're protecting reproductive freedom."</em>).
It's not unexpected but insulting nonetheless that Twitter thinks I'd be interested in a sockpuppet or a childish GIF.
</div>
<img src="CAgovernor_041723.png"/>
<div>
<strong>4/18/23</strong>: From latimes/status/1648153402038267908 (<em>"In her first State of the City speech, Mayor Karen Bass announced a dramatic expansion of her signature program to move homeless people indoors, while also pledging to transform the city into “a new L.A.”"</em>).
Interpreting why some of these replies are "HighQuality" and others are "LowQuality" - and the last just has one view (if Twitter can be believed) - is left as an exercise.
Note also that Elon Musk is censoring a paid blue check (not an uncommon occurence). If paid blue checks are promised they're sent to the top of the list, there might one day be a class action against Musk for fraud.
</div>
<img src="latimes_041823.png"/>
<div>
<strong>4/19/23</strong>: From CAgovernor/status/1648736610283044864 (<em>".@CHP_HQ busted an organized retail theft crime ring targeting Home Depots across Southern California. Officers recovered $150,000 in stolen goods and arrested 3 suspects--all part of our ongoing effort to keep Californians and our businesses safe."</em>).
While most of the replies correctly call Newsom on his pro-crime policies, this one seems to be from someone with industry experience. And, of course, Twitter censored it as "LowQuality".
</div>
<img src="CAgovernor_041923.png"/>
<div>
<strong>4/20/23</strong>: From CAgovernor/status/1649100016781529088 (<em>"California is poised to become one of the world’s largest producers of lithium. We’re building a hub for global innovation while ensuring this transformation benefits communities right here in Imperial Valley, where we're fast-tracking the world’s clean energy future."</em>).
The "HighQuality" reply has no text, it's just a pointless, childish image I've seen dozens of times before. The "LowQuality" reply - agree or disagree - is on-topic and challenges Newsom on the downsides of what he's promoting.
</div>
<img src="CAgovernor_042023.png"/>
<div>
<strong>4/21/23</strong>: From CAgovernor/status/1649555998498242560 (<em>"The Supreme Court is right to take this action to protect access to medication abortion and put a hold on extreme judicial decisions. Medication abortion is available and accessible here in California and we will continue to fight to protect people’s freedom to choose."</em>).
Agree with their sentiments or not, I think we can all agree that the "HighQuality" reply has no quality difference from the "LowQuality" reply.
</div>
<img src="CAgovernor_042123.png"/>
<div>
<strong>4/22/23</strong>: From BrianDahleCA/status/1649471663933902848 (<em>"Californians already pay energy rates that are up to 80 percent higher than the national average, and schemes like this will undoubtedly increase rates. Read more here ➡️ https://bit.ly/40vZKev. #FixCalifornia"</em>).
The Twitter censors are obsessed with goats, but aren't so keen on policy discussions.
</div>
<img src="BrianDahleCA_042223.png"/>
<div>
<strong>4/24/23</strong>: This is flashback from a TheAthleticFC tweet about the World Cup from 11/28/22.
Other than the "FFS", there isn't much difference between the "HighQuality" and the "LowQuality" tweet, and I'm sure you can find dozens of examples of "FFS" in "HighQuality" tweets.
</div>
<img src="twitter-censorship-112822.png"/>
<div>
<strong>4/24/23</strong>: From GavinNewsom/status/1650634702271942656 (<em>"North Dakota GOP have decided to force women to give birth. Even victims of rape. Meanwhile, they voted against providing school meals because child hunger isn't "the responsibility of the state." Mandating birth is state responsibility. Helping feed those kids is not. Got it."</em>).
There are powerful arguments against Newsom's tweet, but the Twitter algorithm made this off-topic childishness the first replies.
</div>
<img src="GavinNewsom_042423.png"/>
<div>
<strong>4/24/23</strong>: From GavinNewsom/status/1651004674877845504 (<em>"We're now at $175,000 and counting. Amazing. So close to $200,000. Let's hit huge numbers for POTUS. Every dollar makes a difference: [actblue link]"</em>).
While both are important, I'd say the censored reply is more important.
</div>
<img src="GavinNewsom_042523.png"/>
<div>
<strong>4/24/23</strong>: From SecondGentleman/status/1648115363412934673 (<em>"When I visited Berlin’s Holocaust Memorial, I was overwhelmed thinking of the millions of lives lost. On Yom HaShoah, we rededicate ourselves to the fight against hate and the promise of Never Again."</em>).
This is the first reply, thanks to the Twitter algorithm.
</div>
<img src="SecondGentleman_042523.png"/>
<div>
<strong>7/03/23</strong>: From larryelder/status/1675976382969520128, the third reply is crypto spam. Thanks to the Twitter algorithm.
</div>
<img src="larryelder_twitter_070323.png"/>
<div>
<strong>7/10/23</strong>: From NFL/status/1678458519094431744, find the most out of place reply.
</div>
<img src="NFL_071023.png"/>
<div>
<strong>7/10/23</strong>: Stumped? Try again using this from SportsCenter/status/1678596069939113984.
</div>
<img src="SportsCenter_071023.png"/>
<div>
<strong>7/15/23</strong>: Compare these "HighQuality" tweets to the "LowQuality" tweets at CAgovernor/status/1680334514050965506:
</div>
<img src="CAgovernor_071523.png"/>
<script src="https://code.jquery.com/jquery-2.2.4.min.js"></script>
<script src="js/sortable.min.js"></script>
<script src="js/readmore.min.js"></script>
<script>
$(document).ready( function() {
$('.readmore').readmore();
});
</script>
</body>
</html>