Repensant els criteris d'èxit d'una publicació

Hola!

Sovint donem voltes a com aplicar mètriques que no es centrin els típics paràmetres quantitatius i simplistes com els likes. Amb aquest objectiu, he començat a desenvolupar una eina que analitzaria diferents mètriques d’una publicació. Entre totes podem pensar què ens agradaria saber i podria reflectir millor relacions de qualitat.

De moment només funciona amb la API de mastodon, però si us agrada puc anar ampliant el programari compatible

L’eina que he desenvolupat accepta un domini i un codi de publicació i de moment retorna:

  1. Quantitat de respostes
  2. Comptes diferents que hi han respost
  3. Interaccions de l’autora amb diferents comptes
  4. Quantitat de servidors que hi han interaccionat
  5. Quantitat de comptes que no seguien l’autor que hi han respost

La mètrica 1 i 2 són bastant quantitatives a l’estil clàssic (i que poden servir per a generar ratios amb la resta), però a partir d’aquí ja intenten donar una idea de diversitat i conversa.

La mètrica 3 puntuaria millor aquelles converses on l’autora parla i respon a diverses usuàries, en contraposició a un compte que només publica i no respon (en anglès broadcaster).

Les mètriques 4 i 5 donen una idea de la transmissió de la publicació/conversa a través de la federació. En particular, la mètrica número 5 dona una idea de fins a on ha arribat la publicació a partir d’amplificacions (potser seria interessant sumar-hi els favs, sumar-hi totes les interaccions).

Aquesta última mètrica, que considero interessant, no és senzilla i té algunes arestes. La primera és tècnica: el que fa és obtenir el llistat de seguidors del compte de l’autora a través de l’API. Com que l’API de mastodon (no sé si és igual amb d’altres programaris) té una limitació de 300 peticions cada 5 minuts, si el compte té molts seguidors he de fer que esperi 5 minuts cada 24.000 seguidors. Per tal de minimitzar aquest problema, he creat una memòria cau que es guarda en un fitxer i que fa servir si tornes a demanar la publicació d’un mateix compte.

La segona aresta és que no pots saber qui seguia al compte abans de publicar el fil. Potser algunes de les seves seguidores són degudes al fil en concret i per tant els va arribar a partir d’una resposta o una amplificació. No crec que es pugui solucionar aquesta imprecisió a no ser que es faci l’anàlisi de manera prospectiva, és a dir capturar els seguidors abans de la primera publicació del fil i llavors analitzar-ho al final amb aquesta llista.

A partir d’aquí, crec que es podrien definir alguns ratios que ajudarien a avaluar les diferents publicacions. Per exemple: 3/2 o 5/2.

Alguns exemples de resultats:

Compte al caché de seguidors.
Mètriques per a la publicació: https://paquita.masto.host/@chinicuil/112421400618819746
Quantitat de respostes: 4
Comptes diferents que hi han respost: 4
Interaccions de l'autora amb diferents comptes: 1
Quantitat de servidors que hi han interaccionat: 3
Quantitat de comptes que no seguien l'autor que hi han respost: 3 | 75%
Compte al caché de seguidors.
Mètriques per a la publicació: https://cosocial.ca/@evan/112457047627977316
Quantitat de respostes: 26
Comptes diferents que hi han respost: 21
Interaccions de l'autora amb diferents comptes: 4
Quantitat de servidors que hi han interaccionat: 18
Quantitat de comptes que no seguien l'autor que hi han respost: 9 | 43%
Compte al caché de seguidors.
Mètriques per a la publicació: https://ec.social-network.europa.eu/@EUCommission/112455456338250699
Quantitat de respostes: 59
Comptes diferents que hi han respost: 44
Interaccions de l'autora amb diferents comptes: 4
Quantitat de servidors que hi han interaccionat: 36
Quantitat de comptes que no seguien l'autor que hi han respost: 16 | 36%
Compte al caché de seguidors.
Mètriques per a la publicació: https://mastodon.green/@fanta/112460979292776731
Quantitat de respostes: 48
Comptes diferents que hi han respost: 25
Interaccions de l'autora amb diferents comptes: 6
Quantitat de servidors que hi han interaccionat: 13
Quantitat de comptes que no seguien l'autor que hi han respost: 4 | 16%

Quines mètriques afegiríeu o canviaríeu?

Codi que ho genera:

import requests
import json
import pandas as pd
import sys
import time
import getopt
 
force_fl = False
 
# Remove 1st argument from the
# list of command line arguments
argumentList = sys.argv[1:]
 
# Options
options = "d:i:f:"
 
# Long options
long_options = ["domain=", "id=", "force="]
 
try:
    # Parsing argument
    arguments, values = getopt.getopt(argumentList, options, long_options)
     
    # checking each argument
    for currentArgument, currentValue in arguments:
 
        if currentArgument in ("-d", "--domain"):
            domain = currentValue
             
        elif currentArgument in ("-i", "--id"):
            post_id = currentValue
             
        elif currentArgument in ("-f", "--force"):
            force_fl = currentValue.lower() == "true"
             
except getopt.error as err:
    # output error, and return with an error code
    print (str(err))

post = requests.get("https://"+domain+"/api/v1/statuses/"+post_id+"/").json()
author = post['account']['id']
url = post['url']
nfoll = post['account']['followers_count']

instance_link = requests.get("https://"+domain+"/.well-known/nodeinfo").json()['links'][0]['href']
instance_software = requests.get(instance_link).json()['software']['name']

responses = requests.get("https://"+domain+"/api/v1/statuses/"+post_id+"/context").json()['descendants']
total_responses = len(responses)
divers_responders_num = len(set([resp['account']['id'] for resp in responses]))
author_pos = [i for i, x in enumerate([resp['account']['id'] for resp in responses]) if x == author]
author_resp_to_dif_acc = len(set([responses[i]['in_reply_to_account_id'] for i in author_pos]))
servers = len(set([resp['account']['url'].split("/")[2] for resp in responses]))

file = open('followers.json', 'r')
dict = json.load(file)

if instance_software == "mastodon":
  if post['account']['acct']+'@'+domain in dict.keys() and force_fl != True:
    print("Compte al caché de seguidors.")
    followers_list = dict[post['account']['acct']+'@'+domain]
  else:
    print("Compte absent al caché de seguidors. L'operació pot tardar aproximadament "+str(round(nfoll/80/300*5))+" min.")
    followers = requests.get("https://"+domain+"/api/v1/accounts/"+author+"/followers?limit=80")
    followers_list = [follower['acct'] for follower in followers.json()]
    while 'next' in followers.links:
      if int(followers.headers['X-RateLimit-Remaining']) <= 10:
        time.sleep(120)
        followers = requests.get(followers.links['next']['url'])
        followers_list = followers_list + [follower['acct'] for follower in followers.json()]
        print(followers.headers['X-RateLimit-Remaining'])
      else:
        followers = requests.get(followers.links['next']['url'])
        followers_list = followers_list + [follower['acct'] for follower in followers.json()]
    dict.update({post['account']['acct']+'@'+domain:followers_list})
    file = open('followers.json', 'w+')
    json.dump(dict, file)
else:
  if post['account']['acct']+'@'+domain in dict.keys() and force_fl != True:
    print("Compte al caché de seguidors.")
    followers_list = dict[post['account']['acct']+'@'+domain]
  else:
    print("Compte absent al caché de seguidors. L'operació pot tardar aproximadament "+str(round(nfoll/80/300*5))+" min.")
    followers = requests.get("https://"+domain+"/api/v1/accounts/"+author+"/followers?limit=80")
    followers_list = [follower['acct'] for follower in followers.json()]
    while 'next' in followers.links:
      followers = requests.get(followers.links['next']['url'])
      followers_list = followers_list + [follower['acct'] for follower in followers.json()]
    dict.update({post['account']['acct']+'@'+domain:followers_list})
    file = open('followers.json', 'w+')
    json.dump(dict, file)
  

responders_acct = list(set([resp['account']['acct'] for resp in responses]))
follower_comparison = len([i for i in responders_acct if i not in followers_list])
foll_comp_perc=100*follower_comparison/divers_responders_num


print("Mètriques per a la publicació: "+url)
print("Quantitat de respostes: "+str(total_responses))
print("Comptes diferents que hi han respost: "+str(divers_responders_num))
print("Interaccions de l'autora amb diferents comptes: "+str(author_resp_to_dif_acc))
print("Quantitat de servidors que hi han interaccionat: "+str(servers))
print("Quantitat de comptes que no seguien l'autor que hi han respost: "+str(follower_comparison)+" | "+str(round(foll_comp_perc))+"%")

``
4 Likes

Com que té cinc punts, se m’ocorre una representació gràfica de les dades que s’assembla al logo de la Fedi :slight_smile:

2 Likes

Jejeje, no estaria mal!

Tot i així, no sé si aquests 5 seran els definitius, crec que hi ha molt de marge per donar-hi voltes…

Per exemple, crec que com més saludable és la xarxa (en el sentit de connexions entre nodes) menys seguidores necessites per a maximitzar la quantitat de comptes que interaccionen que no et segueixen directament. I si ampliem la imatge, la xarxa és més sana quan a molts membres els passa això.

En fi, que dóna per pensar-hi abastament…

1 Like

Hi he afegit “suport” per akkoma (potser d’altres programaris també funcionarien). Això sí, pot ser que peti en algun moment pel límit de peticions. Si és així podem posar-hi alguna solució.

M’agrada la idea! Tot i així, els likes i boosts igual podrien comptar-se d’alguna manera, encara que amb poc pes? Val a dir que m’agrades i impulsos són el més fàcilment generable amb bots…
Sigui com sigui, el que has pensat com a mètrica m’agrada, i crec que apunta molt millor com a criteri d’èxit. I ben pensada la dificultat aquesta del punt 5, ja que efectivament, a mi m’ha passat que em trobo un fil interessant i d’aquí passo a seguir-ne l’autora. Sigui com sigui, crec que també aporta.
Has pensat en alguna utilitat concreta d’això? Per una banda, podria estar bé afegir-ho al costat de cada publicació rebuda o generada per un servidor. Alhora això seria una càrrega forta, especialment perquè per a un post cal fer moltes consultes (sobre el propi fil, i després sobre l’autor). No crec que sigui gaire factible, doncs… Així que igual només com a eina per mirar puntualment l’èxit d’algun post.
Si fos factible que cada post tingués un índex d’èxit associat, aleshores podrien aparèixer dinàmiques de competició sobre això (el que ja passa a les granges antisocials privatives). I ben pensat… a qui li interessaria mesurar l’èxit dels seus posts? Segurament a perfils comercials, o amb un interès d’aprofitar d’alguna manera les interaccions, més enllà del simple fet d’intercanviar i comunicar-se amb altres humans (interès en visibilitat perquè això pot portar clients, propagandistes de tal o qual idea…). Ben mirat, potser millor que realment no s’oferís tal cosa per defecte als posts!

2 Likes

Ei!

Sí, encara no hem definit cap puntuació. Definitivament s’haurien de ponderar totes les interacciones. En aquesta primera aproximació m’interessava més explorar altres mètriques i centrar-me en les respostes perquè són interaccions que generen una xarxa, una conversa.

És una bona pregunta :smile:. No crec que calgui incorporar-ho a cada publicació. Crec que seria interessant analitzar la puntuació mitjana de diversos comptes per a caracteritzar una xarxa. I és que crec que algunes d’aquestes mètriques poden reflectir fortalesa a nivell de xarxa i no només individual. I em sembla una línia de treball súper interessant.

2 Likes

M’està bé aquesta part automatitzada. Igualment, ha de passar una humana a donar-li sentit.

Una altra cosa que també es podria mesurar (però potser no amb la teva eina) seria quelcom que es podria anomenar “continuïtat”. Per exemple: d’un fil de conversa, acaba sorgint una cançó, un club de lectura o alguna cosa en relació o no amb el fil original.

2 Likes

Bingo! Aquí un exemple real. Per mi, aquesta publicació, té una qualitat molt alta:

  • Es comenta un llibre.
  • A la conversa hi participa gent de diversos nodes (almenys n’he comptat set).
  • A la conversa hi participa gent de diversos països (tres, n’he comptat).
  • Hi ha continuïtat: de la conversa sorgeix la idea de muntar un servei lliure.
  • Hi ha fungicitat: a la conversa es descobreixen altres maneres de fer: anartist.org, lectura.social, niboe.info
  • Un plus és que s’emet des d’Akkoma i fomenta la descentralització de la Fedi :wink:
  • Un altre plus és que l’autora del llibre participa a la conversa.

Fil d’exemple:

(això de citar-se a si mateixa és com una mica estrany…)

cc @marcelcosta

2 Likes