introduction
La synthèse de texte est l'une de ces applications du traitement du langage naturel (PNL) qui aura sûrement un grand impact sur nos vies. Avec des médias numériques en croissance et des publications en croissance constante, Qui a le temps de revoir les articles / documents / compléter des livres pour décider s'ils sont utiles ou non? Heureusement, cette technologie est là.
Avez-vous rencontré l'application mobile? en short? Il s'agit d'une application d'actualités innovante qui convertit les articles d'actualités en un résumé de 60 mots. Et c'est exactement ce que nous allons apprendre dans cet article.: Résumé de texte automatique.
La synthèse automatique de texte est l'un des problèmes les plus difficiles et les plus intéressants dans le domaine du traitement du langage naturel. (PNL). C'est un processus de génération d'un résumé de texte concis et significatif à partir de plusieurs ressources textuelles, comme des livres, articles de presse, articles de blog, articles de recherche, e-mails et tweets.
La demande de systèmes automatisés de résumé de texte augmente ces jours-ci grâce à la disponibilité de grandes quantités de données textuelles.
A travers cet article, nous explorerons les domaines du résumé de texte. Nous comprendrons le fonctionnement de l'algorithme TextRank et nous l'implémenterons également en Python. Attachez votre ceinture de sécurité, Cela va être un voyage amusant!
Table des matières
- Approches de synthèse de texte
- Comprendre l'algorithme TextRank
- Comprendre l'énoncé du problème
- Implémentation de l'algorithme TextRank
- Suivant?
Approches de synthèse de texte
La synthèse automatique de texte a attiré l'attention dès la décennie de 1950. UNE travail de recherche, publié par Hans Peter Luhn à la fin des années 1990. 1950, titré “Création automatique de résumés de littérature”, utilisé des caractéristiques telles que la fréquence des mots et la fréquence des phrases pour extraire des phrases importantes du texte à des fins de résumé.
Autre important enquêter, interprété par Harold P. Edmundson à la fin 1960, méthodes utilisées comme la présence de mots-clés, les mots utilisés dans le titre qui apparaissent dans le texte et le placement des phrases, pour extraire des phrases significatives pour le résumé du texte. Depuis, de nombreuses études importantes et passionnantes ont été publiées pour relever le défi de la synthèse automatique de texte.
TLe résumé de l'extension peut être divisé en deux catégories: Résumé extractif Oui Résumé abstrait.
- Résumé extractif: Ces méthodes sont basées sur l'extraction de plusieurs parties, comme des expressions et des phrases, un morceau de texte et empilez-les pour créer un résumé. Donc, Identifier les phrases correctes à résumer est de la plus haute importance dans une méthode extractive.
- Résumé abstrait: Ces méthodes utilisent des techniques avancées de PNL pour générer un tout nouveau résumé.. Certaines parties de ce résumé peuvent même ne pas apparaître dans le texte original.
Dans cet article, nous nous concentrerons sur le résumé extractif technique.
Comprendre l'algorithme TextRank
Avant de commencer avec l'algorithme TextRank, il y a un autre algorithme avec lequel nous devrions nous familiariser: l'algorithme PageRank. En réalité, Ce TextRank vraiment inspiré! Le PageRank est principalement utilisé pour classer les pages Web dans les résultats de recherche en ligne. Comprenons rapidement les bases de cet algorithme à l'aide d'un exemple.
Algorithme PageRank
La source: http://www.scottbot.net/HIAL/
Supposons que nous ayons 4 pages Web: w1, w2, w3 et w4. Ces pages contiennent des liens qui pointent les uns vers les autres. Certaines pages peuvent ne pas avoir de liens; sont appelées pages suspendues.
- La page Web w1 contient des liens vers w2 et w4
- w2 a des liens pour w3 et w1
- w4 a des liens uniquement pour la page Web w1
- w3 n'a pas de liens et, donc, elle s'appellera page suspendue
Pour classer ces pages, il faudrait calculer un score appelé Score PageRank. Ce score est la probabilité qu'un utilisateur visite cette page.
Pour capturer les chances que les utilisateurs naviguent d'une page à l'autre, nous allons créer un carré matrice M, qui a n lignes et n colonnes, où Nord est le nombre de pages Web.
Chaque élément de cette matrice désigne la probabilité qu'un internaute passe d'une page Web à une autre. Par exemple, la cellule en surbrillance ci-dessous contient la probabilité de transition de w1 à w2.
L'initialisation des cotes est expliquée dans les étapes suivantes:
- Probabilité de passer de la page i à j, c'est-à-dire, M[ je ][ j ], est initialisé avec 1 / (nombre de liens uniques sur le site wi)
- S'il n'y a pas de lien entre la page i et j, alors la probabilité sera initialisée avec 0
- Si un utilisateur a atterri sur une page suspendue, il est supposé être également susceptible de passer à n'importe quelle page. Donc, M[ je ][ j ] sera initialisé avec 1 / (nombre de pages Internet)
Donc, dans notre cas, le tableau M sera initialisé comme suit:
Finalement, les valeurs de ce tableau seront mises à jour de manière itérative pour atteindre les classements des pages Web.
Algorithme de plage de texte
Comprenons l'algorithme TextRank, maintenant que nous connaissons le PageRank. J'ai énuméré les similitudes entre ces deux algorithmes ci-dessous:
- Au lieu de pages Web, nous utilisons des phrases.
- La similitude entre deux phrases est utilisée comme équivalente à la probabilité de transition de la page Web.
- Les scores de similarité sont stockés dans une matrice carrée, similaire à la matrice M utilisée pour le PageRank
TextRank est une technique de résumé de texte extractive et non supervisée. Jetons un coup d'œil au flux de l'algorithme TextRank que nous allons suivre:
- La première étape serait de concaténer tout le texte contenu dans les articles.
- Divisez ensuite le texte en phrases individuelles
- A l'étape suivante, on va trouver la représentation vectorielle (incrustations de mots) pour chaque phrase.
- Les similitudes entre les vecteurs de phrases sont calculées et stockées dans une matrice.
- Alors, la matrice de similarité est convertie en un graphique, avec des phrases comme sommets et des scores de similarité comme arêtes, pour calculer l'éventail des phrases.
- Finalement, un certain nombre de phrases les mieux classées forment le résumé final.
Ensuite, sans plus de préambules, Lancez nos Jupyter Notebooks et commençons à coder !!
Noter: Si vous voulez en savoir plus sur la théorie des graphes, je te conseille de vérifier ça Article.
Comprendre l'énoncé du problème
Être un grand fan de tennis, J'essaie toujours de me tenir au courant de ce qui se passe dans le sport en vérifiant religieusement autant de mises à jour de tennis en ligne que possible. Cependant, Cela s'est avéré être un travail assez difficile!! Il y a trop de ressources et le temps est une limitation.
Donc, J'ai décidé de concevoir un système qui pourrait me préparer un résumé à puces en scannant plusieurs articles. Comment faire cela? C'est ce que je vais vous montrer dans ce tuto. Nous appliquerons l'algorithme TextRank sur un ensemble de données d'articles grattés afin de créer un résumé agréable et concis.
Notez qu'il s'agit essentiellement d'une tâche récapitulative multi-documents à domaine unique, c'est-à-dire, nous prendrons plusieurs articles en entrée et générerons un seul résumé à puces. Le résumé textuel multi-domaines n'est pas couvert dans cet article, mais n'hésitez pas à l'essayer à la fin.
Vous pouvez télécharger l'ensemble de données que nous utiliserons à partir de ici.
Implémentation de l'algorithme TextRank
Ensuite, sans plus de préambules, allumez vos notebooks Jupyter et mettons en œuvre ce que nous avons appris jusqu'à présent.
Importer les bibliothèques requises
Premier, importer les bibliothèques que nous exploiterons pour ce défi.
importer numpy en tant que np importer des pandas au format pd importer nltk nltk.télécharger('Point') # exécution unique importation re
Lire les données
Lisons maintenant notre ensemble de données. J'ai fourni le lien pour télécharger les données dans la section ci-dessus (Dans le cas où vous l'avez manqué).
df = pd.read_csv("tennis_articles_v4.csv")
Inspecter les données
Jetons un coup d'œil rapide aux données.
df.head()
Ont 3 colonnes de notre jeu de données: 'article_id', 'article_texte’ y ‘source’. Nous sommes plus intéressés par la colonne ‘article_text’ car il contient le texte des articles. Imprimons certaines des valeurs des variables juste pour voir à quoi elles ressemblent.
df['article_texte'][0]
Production:
"Maria Sharapova n'a pratiquement pas d'amis en tant que joueuses de tennis sur le circuit WTA. Le joueur russe n'a aucun problème à en parler ouvertement et dans une récente interview, elle a dit: 'Je n'ai pas vraiment cacher trop de sentiments. Je pense que tout le monde sait que c'est mon travail ici. Quand je suis sur les courts ou quand je suis sur le terrain en train de jouer, Je suis un compétiteur et je veux battre chaque personne, que ce soit ils sont dans les vestiaires ou de l'autre côté du filet...
df['article_texte'][1]
BÂLE, la Suisse (PA), Roger Federer s'est qualifié pour la 14e finale des Swiss Indoors de sa carrière en battant
Daniil Medvedev, septième tête de série 6-1, 6-4 Samedi. En quête d'un neuvième titre lors de l'événement de sa ville natale, et un 99e
globalement, Federer affrontera Marius Copil, classé 93e, dimanche. Federer dominated the 20th-ranked Medvedev and had
his first match-point chance to break serve again at 5-1...
df['article_texte'][2]
Roger Federer a révélé que les organisateurs de la Coupe Davis relancée et condensée lui ont donné trois jours pour décider s'il s'engagerait dans le concours controversé. S'exprimant lors du tournoi Swiss Indoors où il jouer en finale dimanche contre le qualifié roumain Marius Copil, le numéro trois mondial a déclaré qu'étant donné la délai incroyablement court pour prendre une décision, il s'est désengagé de tout engagement...
Maintenant nous avons 2 options: nous pouvons résumer chaque article individuellement ou nous pouvons générer un seul résumé pour tous les articles. Pour notre propos, nous allons aller de l'avant avec ce dernier.
Diviser le texte en phrases
Maintenant, la prochaine étape consiste à diviser le texte en phrases individuelles. Nous utiliserons le sent_tokenize () fonction de la nltk bibliothèque pour le faire.
depuis nltk.tokenize importer sent_tokenize phrases = [] pour s dans df['article_texte']: phrases.append(sent_tokenize(s)) phrases = [y pour x dans les phrases pour y dans x] # liste aplatie
Imprimons quelques éléments de la liste. phrases.
Phrases[:5]
Production:
["Maria Sharapova n'a pratiquement pas d'amis en tant que joueuses de tennis sur le circuit WTA.", "Le joueur russe n'a aucun problème à en parler ouvertement et dans un récent interview elle a dit: «Je ne cache pas vraiment trop de sentiments.", "Je pense que tout le monde sait que c'est mon travail ici.", "Quand je suis sur le terrain ou quand je suis sur le terrain en train de jouer, Je suis un compétiteur et je veux battre chaque personne, qu'elle soit dans le vestiaire ou à travers le net. Donc, je ne suis pas le seul à engager une conversation sur la météo et sachez que dans les prochaines minutes, je dois aller essayer de gagner un match de tennis.", "Je suis une fille assez compétitive."]
Descarga GloVe Word Embeddings
Gant Les incrustations de mots sont des représentations vectorielles de mots. Ces incrustations de mots seront utilisées pour créer des vecteurs pour nos phrases. Nous aurions également pu utiliser les approches Bag-of-Words ou TF-IDF pour créer des caractéristiques pour nos phrases, mais ces méthodes ignorent l'ordre des mots (et le nombre de fonctionnalités est généralement assez important).
Nous utiliserons le pré-formé Wikipédia 2014 + Gigamot 5 Vecteurs de gants disponibles ici. Avis: la taille de ces plongements de mots est 822 Mo.
!wget http://nlp.stanford.edu/data/glove.6B.zip !dézippez le gant*.zip
Extrayons les mots ou vecteurs de mots intégrés.
# Extraire les vecteurs de mots word_embeddings = {} f = ouvert('gant.6B.100d.txt', encodage='utf-8') pour la ligne en f: valeurs = ligne.split() mot = valeurs[0] coefs = par exemple asarray(valeurs[1:], type="float32") word_embeddings[mot] = coefs f.fermer()
longueur(word_embeddings)
400000
Nous avons maintenant des vecteurs de mots pour 400.000 différents termes stockés dans le dictionnaire: 'word_embeddings'.
Prétraitement de texte
C'est toujours une bonne pratique de rendre vos données textuelles sans bruit autant que possible. Ensuite, faisons un peu de nettoyage de texte de base.
# supprimer les ponctuations, chiffres et caractères spéciaux clean_sentences = pd.Series(Phrases).str.remplacer("[^ a-zA-Z]", " ") # mettre des alphabets en minuscules clean_sentences = [Ralentissez() pour s dans clean_sentences]
Élimine les mots vides (mots couramment utilisés d'une langue: il est, un m, les, de, dans, etc.) présent dans les prières. Si vous n'avez pas téléchargé nltk-mots vides, puis exécutez la ligne de code suivante:
nltk.télécharger('mots vides')
Maintenant, nous pouvons importer les mots vides.
à partir de nltk.corpus importer des mots vides mots_arrêts = mots arrêtés.mots('Anglais')
Définissons une fonction pour supprimer ces mots vides de notre ensemble de données.
# fonction pour supprimer les mots vides def remove_stopwords(son): sen_new = " ".rejoindre([i for i in sen if i not in stop_words]) sen_new de retour
# supprimer les mots vides des phrases clean_sentences = [remove_stopwords(r.split()) pour r dans clean_sentences]
nous utiliserons clean_sentences pour créer des vecteurs pour les phrases dans nos données à l'aide des vecteurs de mots GloVe.
Représentation vectorielle des phrases
# Extraire les vecteurs de mots word_embeddings = {} f = ouvert('gant.6B.100d.txt', encodage='utf-8') pour la ligne en f: valeurs = ligne.split() mot = valeurs[0] coefs = par exemple asarray(valeurs[1:], type="float32") word_embeddings[mot] = coefs f.fermer()
À présent, créons des vecteurs pour nos prières. Nous allons d'abord chercher des vecteurs (chacun des articles de taille 100) pour les mots constitutifs d'une phrase puis on prendra la moyenne / moyenne de ces vecteurs pour arriver à un vecteur consolidé pour la phrase.
vecteurs_phrases = [] pour i dans clean_sentences: si len(je) != 0: v = somme([word_embeddings.get(w, np.zéros((100,))) pour w dans i.split()])/(longueur(Je partage())+0.001) autre: v = np.zéros((100,)) phrase_vecteurs.append(v)
Noter: Pour plus de bonnes pratiques en matière de prétraitement de texte, vous pouvez consulter notre cours vidéo, Traitement du langage naturel (PNL) en utilisant Python.
Préparation de la matrice de similarité
L'étape suivante consiste à trouver des similitudes entre les phrases, et nous utiliserons l'approche de similarité cosinus pour ce défi. Créons une matrice de similarité vide pour cette tâche et remplissons avec les similitudes cosinus des phrases.
Définissons d'abord un tableau de dimension zéro (m * m). Nous allons initialiser cette matrice avec les scores de similarité cosinus des phrases. Ici, Nord est le nombre de phrases.
# matrice de similarité sim_mat = np.zeros([longueur(Phrases), longueur(Phrases)])
Nous utiliserons la similarité en cosinus pour calculer la similarité entre une paire de phrases.
de sklearn.metrics.pairwise importer cosine_similarity
Et initialiser la matrice avec des scores de similarité cosinus.
pour moi à portée(longueur(Phrases)): pour j dans la plage(longueur(Phrases)): si je != j: sim_mat[je][j] = cosinus_similarité(vecteurs_de_phrase[je].remodeler(1,100), vecteurs_de_phrase[j].remodeler(1,100))[0,0]
Application de l'algorithme PageRank
avant de continuer, convertir la matrice de similarité sim_mat sur un graphique. Les nœuds de ce graphique représenteront les phrases et les arêtes représenteront les scores de similarité entre les phrases. Dans ce graphique, nous appliquerons l'algorithme PageRank pour arriver à la classification des phrases.
importer networkx en tant que nx nx_graph = nx.from_numpy_array(sim_mat) scores = nx.pagerank(nx_graph)
Extraction de résumé
Finalement, il est temps d'extraire les N meilleures phrases en fonction de leur classement pour la génération de résumé.
classé_sentences = trié(((notes[je],s) pour moi,s dans énumérer(Phrases)), inverse=Vrai)
# Extraire le haut 10 phrases comme résumé pour moi à portée(10): imprimer(phrases_classées[je][1])
Quand je suis sur le terrain ou quand je suis sur le terrain en train de jouer, Je suis un compétiteur et je veux battre chaque personne qu'ils soient dans les vestiaires ou de l'autre côté du net. Je ne suis donc pas le seul à engager une conversation sur le météo et sachez que dans les prochaines minutes je dois aller essayer de gagner un match de tennis. Les principaux acteurs estiment qu'un grand événement fin novembre combiné à un autre en janvier avant l'Open d'Australie signifie trop de tennis et trop peu de repos. S'exprimant lors du tournoi Swiss Indoors où il jouera en finale dimanche contre le qualifié roumain Marius Copil, le numéro trois mondial a déclaré qu'étant donné le délai incroyablement court pour prendre une décision, il s'est retiré tout engagement. "J'avais l'impression que les meilleures semaines où j'ai eu à connaître les joueurs quand je jouais étaient les semaines de la Fed Cup ou les Semaines olympiques, pas forcément pendant les tournois. Actuellement à la neuvième place, Nishikori avec une victoire pourrait se déplacer à l'intérieur 125 points de coupe pour l'épreuve à huit à Londres le mois prochain. Il a utilisé sa première balle de break pour boucler le premier set avant de remonter 3-0 dans le second et concluant le gagner sur sa première balle de match. L'Espagnol a battu Anderson à deux reprises dans la seconde mais n'a pas eu une autre chance sur le service du Sud-Africain dans le ensemble final. "On avait aussi l'impression qu'à ce stade il valait peut-être mieux jouer des matchs que de s'entraîner. Le concours devrait présenter 18 pays en novembre 18-24 finale à Madrid l'année prochaine, et remplacera les matchs aller-retour classiques joués quatre fois par an pendant des décennies. Federer a déclaré plus tôt ce mois-ci à Shanghai que ses chances de jouer la Coupe Davis étaient pratiquement inexistantes.
Et c'est reparti! Un résumé étonnant, organiser, concis et utile pour nos articles.
Suivant?
La synthèse automatique de texte est un sujet brûlant de recherche et, dans cet article, nous n'avons couvert que la pointe de l'iceberg. Dans le futur, nous explorerons la technique de résumé de texte abstrait où l'apprentissage en profondeur joue un rôle important. En outre, nous pouvons également examiner les tâches récapitulatives suivantes:
Spécifique au problème
- Résumé textuel multi-domaines
- Résumé du document unique
- Résumé du texte en plusieurs langues (source dans une langue et résumé dans une autre langue)
Spécifique à l'algorithme
- Résumé textuel utilisant RNN et LSTM
- Résumé du texte à l'aide de l'apprentissage par renforcement
- Résumé de texte au moyen de réseaux génératifs conflictuels (GAN)
Remarques finales
J'espère que cet article vous a aidé à comprendre le concept de résumé automatique de texte. Il a une variété de cas d'utilisation et a engendré des applications extrêmement réussies. Soit pour profiter de votre entreprise ou simplement pour votre propre connaissance, le résumé de texte est une approche que tous les passionnés de PNL devraient connaître.
J'essaierai de couvrir la technique de résumé de texte abstrait en utilisant des techniques avancées dans un prochain article.. Pendant, n'hésitez pas à utiliser la section commentaires ci-dessous pour me faire part de vos réflexions ou poser toutes les questions que vous pourriez avoir sur cet article..