Text Mining: comment regrouper des textes (par exemple des articles de presse) avec l'intelligence artificielle?

15

J'ai construit des réseaux de neurones (MLP (entièrement connecté), Elman (récurrent)) pour différentes tâches, comme jouer au Pong, classer les chiffres manuscrits et tout ça ...

De plus, j'ai essayé de construire certains premiers réseaux de neurones convolutifs, par exemple pour classer des notes manuscrites à plusieurs chiffres, mais je suis complètement nouveau pour analyser et regrouper des textes, par exemple dans les tâches de reconnaissance / clustering d'images, on peut s'appuyer sur une entrée standardisée, comme des images de taille 25x25, RVB ou niveaux de gris et ainsi de suite ... il existe de nombreuses fonctionnalités de pré-hypothèse.

Pour l'exploration de texte, par exemple les articles de presse, vous avez une taille d'entrée en constante évolution (différents mots, différentes phrases, différentes longueurs de texte, ...).

Comment mettre en œuvre un outil d'exploration de texte moderne utilisant l'intelligence artificielle, de préférence des réseaux de neurones / SOM?

Malheureusement, je n'ai pas pu trouver de didacticiels simples pour commencer. Les articles scientifiques complexes sont difficiles à lire et ne sont pas la meilleure option pour apprendre un sujet (selon moi). J'ai déjà lu pas mal d'articles sur les MLP, les techniques de décrochage, les réseaux de neurones convolutifs et ainsi de suite, mais je n'ai pas pu en trouver un de base sur l'exploration de texte - tout ce que j'ai trouvé était beaucoup trop élevé pour mes compétences très limitées d'exploration de texte.

daniel451
la source

Réponses:

12

L'allocation de Dirichlet latente (LDA) est excellente, mais si vous voulez quelque chose de mieux qui utilise des réseaux de neurones, je suggère fortement doc2vec ( https://radimrehurek.com/gensim/models/doc2vec.html ).

Ce qu'il fait? Il fonctionne de manière similaire à word2vec de Google, mais au lieu d'un seul vecteur de fonctionnalité de mot, vous obtenez un vecteur de fonctionnalité pour un paragraphe. La méthode est basée sur un modèle de saut de gramme et des réseaux de neurones et est considérée comme l'une des meilleures méthodes pour extraire un vecteur de caractéristiques pour les documents.

Maintenant que vous disposez de ce vecteur, vous pouvez exécuter le clustering k-means (ou tout autre algorithme préférable) et regrouper les résultats.

Enfin, pour extraire les vecteurs de fonctionnalités, vous pouvez le faire aussi facilement que cela:

from gensim.models import Doc2Vec
from gensim.models.doc2vec import LabeledSentence

class LabeledLineSentence(object):
    def __init__(self, filename):
        self.filename = filename
    def __iter__(self):
        for uid, line in enumerate(open(self.filename)):
            yield LabeledSentence(words=line.split(), labels=['TXT_%s' % uid])


sentences = LabeledLineSentence('your_text.txt')

model = Doc2Vec(alpha=0.025, min_alpha=0.025, size=50, window=5, min_count=5,
                dm=1, workers=8, sample=1e-5)

model.build_vocab(sentences)

for epoch in range(500):
    try:
        print 'epoch %d' % (epoch)
        model.train(sentences)
        model.alpha *= 0.99
        model.min_alpha = model.alpha
    except (KeyboardInterrupt, SystemExit):
        break
Yannis Assael
la source
2
Il semble que dans la littérature PNL, LDA se réfère à l'analyse de Dirichlet latente. Dans cette littérature, l'analyse linéaire discriminante ne trouve-t-elle aucune utilité?
Sid
Exactement, LDA est l'allocation de Dirichlet latente dans notre cas.
Yannis Assael
5

En dehors de LDA, vous pouvez utiliser l' analyse sémantique latente avec K-Means . Ce ne sont pas des réseaux de neurones, mais plutôt un clustering "classique", mais cela fonctionne plutôt bien.

Exemple en sklearn (tiré d' ici ):

dataset = fetch_20newsgroups(subset='all', shuffle=True, random_state=42)
labels = dataset.target
true_k = np.unique(labels).shape[0]

vectorizer = TfidfTransformer()
X = vectorizer.fit_transform(dataset.data)

svd = TruncatedSVD(true_k)
lsa = make_pipeline(svd, Normalizer(copy=False))

X = lsa.fit_transform(X)

km = KMeans(n_clusters=true_k, init='k-means++', max_iter=100)
km.fit(X)

Désormais, les étiquettes d'affectation de cluster sont disponibles dans km.labels_

Par exemple, ce sont les sujets extraits de 20 groupes de discussion avec LSA:

Cluster 0:  space  shuttle  alaska  edu  nasa  moon  launch  orbit  henry  sci
Cluster 1:  edu  game  team  games  year  ca  university  players  hockey  baseball
Cluster 2:  sale  00  edu  10  offer  new  distribution  subject  lines  shipping
Cluster 3:  israel  israeli  jews  arab  jewish  arabs  edu  jake  peace  israelis
Cluster 4:  cmu  andrew  org  com  stratus  edu  mellon  carnegie  pittsburgh  pa
Cluster 5:  god  jesus  christian  bible  church  christ  christians  people  edu  believe
Cluster 6:  drive  scsi  card  edu  mac  disk  ide  bus  pc  apple
Cluster 7:  com  ca  hp  subject  edu  lines  organization  writes  article  like
Cluster 8:  car  cars  com  edu  engine  ford  new  dealer  just  oil
Cluster 9:  sun  monitor  com  video  edu  vga  east  card  monitors  microsystems
Cluster 10:  nasa  gov  jpl  larc  gsfc  jsc  center  fnal  article  writes
Cluster 11:  windows  dos  file  edu  ms  files  program  os  com  use
Cluster 12:  netcom  com  edu  cramer  fbi  sandvik  408  writes  article  people
Cluster 13:  armenian  turkish  armenians  armenia  serdar  argic  turks  turkey  genocide  soviet
Cluster 14:  uiuc  cso  edu  illinois  urbana  uxa  university  writes  news  cobb
Cluster 15:  edu  cs  university  posting  host  nntp  state  subject  organization  lines
Cluster 16:  uk  ac  window  mit  server  lines  subject  university  com  edu
Cluster 17:  caltech  edu  keith  gatech  technology  institute  prism  morality  sgi  livesey
Cluster 18:  key  clipper  chip  encryption  com  keys  escrow  government  algorithm  des
Cluster 19:  people  edu  gun  com  government  don  like  think  just  access

Vous pouvez également appliquer la factorisation matricielle non négative , qui peut être interprétée comme un clustering. Tout ce que vous devez faire est de prendre le plus grand composant de chaque document dans l'espace transformé - et de l'utiliser comme affectation de cluster.

En sklearn:

nmf = NMF(n_components=k, random_state=1).fit_transform(X)
labels = nmf.argmax(axis=1)
Alexey Grigorev
la source
Comment avez-vous obtenu les meilleurs mots pour chaque cluster?
Mayukh Nair
3

LSA + KMeans fonctionne bien mais vous devez saisir le nombre de clusters que vous attendez. De plus, le coefficient de silhouette des grappes trouvées est généralement faible.

Une autre méthode avec laquelle j'obtiens de meilleurs résultats consiste à utiliser l' exemple DBSCAN ici . Il recherche des centres de haute densité et se dilate pour former des grappes. Dans cette méthode, il trouve automatiquement la quantité optimale de clusters.

J'ai également trouvé très important d'utiliser un stemmer, comme Snowball par exemple, qui réduit les erreurs dues aux fautes de frappe. Une bonne liste de mots vides est également très importante si vous voulez être sûr de vous débarrasser de certains clusters qui n'auraient aucun sens en raison de la forte occurrence de mots communs sans signification significative. Lorsque vous construisez votre matrice de comptage, la normalisation est également importante, elle permet d'ajouter du poids à un mot avec une faible occurrence dans l'ensemble de données, mais avec une occurrence élevée dans des échantillons particuliers. Ces mots ont un sens et vous ne voulez pas les manquer. Il réduit également le poids des mots avec des occurrences élevées dans tous les échantillons particuliers (proche du mot d'arrêt mais pour les mots qui peuvent avoir un peu de sens). Une dernière chose que j'ai remarquée était importante n'est pas d'imprimer les 10 premiers mots de vos clusters, mais une sélection plus étendue. Habituellement, la qualité et la pertinence des mots clés par rapport au libellé que vous attribuez au cluster ont tendance à diminuer considérablement après ces 10 à 20 premiers mots. Ainsi, une vue étendue des principaux mots clés vous aidera à analyser si votre cluster est vraiment pertinent ou très pollué par le bruit.

Vincent Teyssier
la source
2

Ma méthode préférée est le LDA ; vous pouvez consulter ici un tutoriel utilisant des packages python.

Vous pouvez également consulter des méthodes beaucoup plus simples comme celle-ci .

omerbp
la source