Ce notebook utilise spacy.io pour identifier et collecter certains types d'entités: Personnes, GPE, NORP, ...
Voir https://spacy.io/docs/usage/entity-recognition pour la liste complète des entités identifiables par spacy
import pandas as pd
import numpy as np
import csv, re, string
import spacy
# load les données
df = pd.read_csv('../data/facebook_god_emperor_trump.csv', low_memory=False)
# échantillonage aléatoire des données ce qui permet
# de faire tourner le script sur un subset du dataset
# frac = 0.5 => 50% du dataset original
frac = 1
df = df.sample(frac = frac)
print("\n-- Le dataset a {0} rows".format(df.shape[0]))
print("\n-- columns")
print(df.columns)
print("\n-- head")
print(df.head())
On s'intéresse surtout aux personnes, GPE (pays, villes, états), ORG (entreprises, marques) et NORP (nationalités, religions, ...). Le NER de spacy n'est pas 100% précis. Mais c'est cela qui nous sera utile pour identifier les détournements des noms de personnes, de pays (Murica pour America) ou d'autres entités (4chan, Fox News, ...)
Voir https://spacy.io/docs/usage/entity-recognition pour d'autres exemples d'utilisation du NER de spacy.io
# charger le modele spacy en anglais
nlp = spacy.load('en')
# Très simplement, ajouter stocker chaque entité dans une liste
persons = []
GPE = []
ORG = []
NORP = []
entities = [] # pour toutes les autres entités hors date ou chiffre
# Parcourir tous les rows de la dataframe
for i,d in df.iterrows():
# parser chaque message avec spacy
doc = nlp(d.message)
# si spacy a identifié des entités:
if len(doc.ents) > 0:
for ent in doc.ents:
if ent.label_ == 'PERSON':
persons.append(str(ent))
elif ent.label_ == 'GPE':
GPE.append(str(ent))
elif ent.label_ == 'NORP':
NORP.append(str(ent))
elif ent.label_ == 'ORG':
ORG.append(str(ent))
# Toutes les autres entités trouvées en dehors des dates et chiffres
elif (ent.label_ not in ['CARDINAL', 'ORDINAL', 'PERCENT','DATE','TIME']) :
entities.append((str(ent), ent.label_))
# mémoriser les différentes entités dans des fichiers
open('../data/persons.txt', 'w').write("\n".join( sorted(persons) ))
open('../data/gpe.txt', 'w').write("\n".join( sorted(GPE) ))
open('../data/norp.txt', 'w').write("\n".join( sorted(NORP) ))
open('../data/org.txt', 'w').write("\n".join( sorted(ORG) ))
# Sauvegarder les autres type d'entités ainsi que leur type
str_entities = [ "{0},{1}".format(e[1], str(e[0]).replace(',',' ')) for e in entities ]
open('../data/entities.csv', 'w').write("\n".join( str_entities ))