Ncrafts : Machine learning the F# way

Cellenza était présent à la conférence Ncrafts. J’ai eu la chance de m’y rendre et d’assister à la session « F# et le machine learning », animée par Evelina Gabasova.

L’idée de cette session est de trouver la personne centrale sur Twitter pour un mot clef donné.

Pour commencer, elle nous explique que Twitter est un graphe orienté.
– Je suis quelqu’un donc je suis un follower.
– Je suis suivi donc je suis followé.
– Les deux personnes se suivent :  ils sont amis.

Extraire les données en F#

Ensuite, petite explication sur comment récupérer les followers de quelqu’un. En interrogeant l’api de Twitter vous récupérez du Json. Ce json peut être manipulé en F# directement via l’api.

Pour cela, elle utilise FSharp.Data avec la librarie pour twitter FSharp.Data.Toolbox.Twitter.

Après cela, on va récupérer tous les followers des followers. Cela prend un peu de temps à cause des limitations de l’api. Evelina a donc préparé en amont des fichiers json.

// Get friends list of the F# Software Foundation
// i.e. accounts that F# foundation follows
let friends = twitter.Connections.FriendsIds(screenName="@fsharporg")
friends.Ids |> Seq.length
 
// Get list of followers for @fsharporg
let followers = twitter.Connections.FollowerIds(screenName="@fsharporg")
followers.Ids |> Seq.length
 
// Create a set of accounts around @fsharporg with a test for inclusion
let idsOfInterest = Seq.append friends.Ids followers.Ids |> set

Graphe

La façon la plus simple de faire un graphe est une matrice. Chaque point de celle-ci sera à zéro sauf si quelqu’un suit une autre personne.

Pour cela, la librairie MathNet Numerics FSharp permet de créer des matrices et de travailler dessus.

let links =
 seq { for link in userLinks.Links -> link.Source, link.Target, 1.0 }
 |> SparseMatrix.ofSeqi nodeCount nodeCount

Comment classer ?

Comment trouver quelqu’un d’influent ? La première étape est de faire la somme de chaque colonne et de trier les gens selon ce résultat.
let indegree (linkMatrix: float Matrix) =
[| for inlinks in linkMatrix.EnumerateColumns() -> inlinks.Sum() |]

Et pour afficher le top utilisateur :

let topUsers (ranking:float seq) count =
 ranking
 |> Seq.mapi (fun i x -> (i,x))
 |> Seq.sortBy (fun (i,x) -> - x)
 |> Seq.take count
 |> Seq.map (fun (i,x) ->
    let id, name = idxToIdName i
    (id, name, x))
 
// Get a list of people that have most followers
topUsers indegrees 100
 |> Seq.iteri (fun i (id, name, value) ->
printfn "%d. %s has indegree %.0f" (i+1) name value)

Pour aller plus loin ?

Pour aller plus loin et être plus pertinent, elle propose l’utilisation du page rank. La personne la plus suivie n’est pas forcément la plus influente.
Elle nous fait la démo du page rank implémenté à la main ce qui fait quelques lignes de code mais reste encore raisonnable.
Puis, nous dit que c’est sympa mais il y a des implémentations toutes faites.

En conclusion

Pour un code qui tient en 200 lignes environ, on a la possibilité de sortir la liste des utilisateurs les plus influents sur twitter en fonction d’un mot clef donné. Pour suivre Evelina GABASOVA, vous pouvez utiliser son Twitter :@evelgab ou son blog http://evelinag.com/

Tags: F#,

Un commentaire. Laisser un commentaire

[…] Ncrafts : Machine learning the F# way – Aurélien Galtier […]

Répondre

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *