Minería de texto: ¿cómo agrupar textos (por ejemplo, artículos de noticias) con inteligencia artificial?

15

He construido algunas redes neuronales (MLP (completamente conectadas), Elman (recurrente)) para diferentes tareas, como jugar Pong, clasificar dígitos escritos a mano y otras cosas ...

Además, intenté construir algunas primeras redes neuronales convolucionales, por ejemplo, para clasificar notas manuscritas de varios dígitos, pero soy completamente nuevo para analizar y agrupar textos, por ejemplo, en tareas de reconocimiento / agrupación de imágenes, uno puede confiar en entradas estandarizadas, como imágenes de tamaño 25x25, RGB o escala de grises y así sucesivamente ... hay muchas características de pre-suposición.

Para la minería de texto, por ejemplo, artículos de noticias, tiene un tamaño de entrada siempre cambiante (palabras diferentes, oraciones diferentes, longitud de texto diferente, ...).

¿Cómo se puede implementar una herramienta moderna de minería de texto utilizando inteligencia artificial, preferiblemente redes neuronales / SOM?

Lamentablemente, no pude encontrar tutoriales simples para comenzar. Los artículos científicos complejos son difíciles de leer y no son la mejor opción para aprender un tema (en mi opinión). Ya leí algunos artículos sobre MLP, técnicas de abandono, redes neuronales convolucionales, etc., pero no pude encontrar uno básico sobre minería de texto: todo lo que encontré fue un nivel demasiado alto para mis habilidades de minería de texto muy limitadas.

daniel451
fuente

Respuestas:

12

La asignación de Dirichlet latente (LDA) es excelente, pero si desea algo mejor que use redes neuronales, le recomendaría doc2vec ( https://radimrehurek.com/gensim/models/doc2vec.html ).

¿Que hace? Funciona de manera similar al word2vec de Google, pero en lugar de un vector de características de una sola palabra, obtienes un vector de características para un párrafo. El método se basa en un modelo de salto de gramo y redes neuronales y se considera uno de los mejores métodos para extraer un vector de características para documentos.

Ahora que tiene este vector, puede ejecutar el agrupamiento de k-means (o cualquier otro algoritmo preferible) y agrupar los resultados.

Finalmente, para extraer los vectores de características puede hacerlo tan fácil como eso:

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
fuente
2
Parece que en la literatura de la PNL LDA se refiere al análisis de Dirichlet latente. ¿En esta literatura el Análisis Discriminante Lineal no encuentra uso?
Sid
Exactamente, LDA es la asignación de Dirichlet latente en nuestro caso.
Yannis Assael
5

Además de LDA, puede usar el análisis semántico latente con K-Means . No se trata de redes neuronales, sino de agrupamiento "clásico", pero funciona bastante bien.

Ejemplo en sklearn (tomado de aquí ):

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)

Ahora las etiquetas de asignación de clúster están disponibles en km.labels_

Por ejemplo, estos son los temas extraídos de 20 grupos de noticias con 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

También puede aplicar la factorización de matriz no negativa , que puede interpretarse como agrupamiento. Todo lo que necesita hacer es tomar el componente más grande de cada documento en el espacio transformado, y usarlo como asignación de clúster.

En sklearn:

nmf = NMF(n_components=k, random_state=1).fit_transform(X)
labels = nmf.argmax(axis=1)
Alexey Grigorev
fuente
¿Cómo obtuviste las palabras principales para cada grupo?
Mayukh Nair el
3

LSA + KMeans funciona bien, pero debe ingresar la cantidad de clústeres que espera. Además, el coeficiente de silueta de los grupos encontrados es generalmente bajo.

Otro método con el que obtengo mejores resultados es usar el ejemplo DBSCAN aquí . Busca centros de alta densidad y se expande para formar grupos. En este método, encuentra automáticamente la cantidad óptima de clústeres.

También me pareció muy importante usar un stemmer, como Snowball para ex, que reduce los errores debidos a errores tipográficos. Una buena lista de palabras de detención también es muy importante si desea asegurarse de deshacerse de algunos grupos que no tendrían significado debido a la alta aparición de palabras comunes sin significado significativo. Cuando construye su matriz de conteo, la normalización también es importante, ya que permite agregar peso a una palabra con una ocurrencia baja en el conjunto de datos, pero con una ocurrencia alta en muestras particulares. Estas palabras son significativas y no te las quieres perder. También reduce el peso de las palabras con altas ocurrencias en todas las muestras particulares (cerca de la palabra de detención, pero para las palabras que pueden tener un poco de significado). Una última cosa que noté que era importante no es imprimir las 10 palabras principales de sus grupos, sino una selección más extensa. Por lo general, la calidad y relevancia de las palabras clave para la etiqueta que le daría al clúster tienden a reducirse drásticamente después de estas 10-20 palabras principales. Por lo tanto, una vista ampliada de las principales palabras clave lo ayudará a analizar si su clúster es realmente relevante o está muy contaminado por el ruido.

Vincent Teyssier
fuente
2

Mi método favorito es LDA ; Puede buscar aquí un tutorial con paquetes de Python.

También puede ver métodos mucho más simples como este .

omerbp
fuente