Mineração de texto: como agrupar textos (por exemplo, artigos de notícias) com inteligência artificial?

15

Eu construí algumas redes neurais (MLP (totalmente conectadas), Elman (recorrente)) para tarefas diferentes, como jogar Pong, classificar dígitos manuscritos e outras coisas ...

Além disso, tentei criar algumas primeiras redes neurais convolucionais, por exemplo, para classificar notas manuscritas de vários dígitos, mas sou completamente novo para analisar e agrupar textos, por exemplo, nas tarefas de reconhecimento / agrupamento de imagens, podemos confiar em entradas padronizadas, como imagens de tamanho 25x25, RGB ou escala de cinza e assim por diante ... há muitos recursos de pré-suposição.

Para mineração de texto, por exemplo, artigos de notícias, você tem um tamanho de entrada em constante mudança (palavras diferentes, frases diferentes, tamanho de texto diferente, ...).

Como implementar uma ferramenta moderna de mineração de texto utilizando inteligência artificial, de preferência redes neurais / SOMs?

Infelizmente, não consegui encontrar tutoriais simples para começar. Trabalhos científicos complexos são difíceis de ler e não são a melhor opção para aprender um tópico (como na minha opinião). Eu já li alguns artigos sobre MLPs, técnicas de abandono, redes neurais convolucionais e assim por diante, mas não consegui encontrar um básico sobre mineração de texto - tudo o que encontrei foi um nível alto demais para minhas habilidades muito limitadas de mineração de texto.

daniel451
fonte

Respostas:

12

A Alocação de Dirichlet Latente (LDA) é ótima, mas se você quiser algo melhor que use redes neurais, sugiro fortemente o doc2vec ( https://radimrehurek.com/gensim/models/doc2vec.html ).

O que faz? Funciona da mesma forma que o word2vec do Google, mas em vez de um vetor de recurso de palavra única, você obtém um vetor de recurso para um parágrafo. O método é baseado em um modelo de pular grama e redes neurais e é considerado um dos melhores métodos para extrair um vetor de recurso para documentos.

Agora que você tem esse vetor, é possível executar o cluster de k-means (ou qualquer outro algoritmo preferível) e agrupar os resultados.

Por fim, para extrair os vetores de recursos, você pode fazer isso da maneira mais fácil:

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
fonte
2
Parece que, na literatura da PNL, o LDA se refere à Análise de Dirichlet Latente. Nesta literatura, a Análise Discriminante Linear não tem utilidade?
Sid
Exatamente, a LDA é a Alocação de Dirichlet Latente no nosso caso.
Yannis Assael
5

Além do LDA, você pode usar a Análise Semântica Latente com K-Means . Não são redes neurais, mas agrupamentos "clássicos", mas funcionam muito bem.

Exemplo no sklearn (extraído daqui ):

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)

Agora os rótulos de atribuição de cluster estão disponíveis em km.labels_

Por exemplo, estes são os tópicos extraídos de 20 grupos de notícias com o 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

Você também pode aplicar a fatoração de matriz não negativa , que pode ser interpretada como cluster. Tudo o que você precisa fazer é pegar o maior componente de cada documento no espaço transformado - e usá-lo como atribuição de cluster.

No sklearn:

nmf = NMF(n_components=k, random_state=1).fit_transform(X)
labels = nmf.argmax(axis=1)
Alexey Grigorev
fonte
Como você conseguiu as principais palavras para cada cluster?
Mayukh Nair
3

O LSA + KMeans funciona bem, mas você precisa inserir a quantidade de clusters que espera. Além disso, o coeficiente de silhueta dos grupos encontrados é geralmente baixo.

Outro método com o qual obtenho melhores resultados é usar o exemplo DBSCAN aqui . Ele procura por centros de alta densidade e se expande para formar aglomerados. Nesse método, ele encontra automaticamente a quantidade ideal de clusters.

Também achei muito importante usar um derivador, como o Snowball para ex, que reduz os erros devido a erros de digitação. Uma boa lista de palavras de parada também é muito importante se você quiser se livrar de alguns clusters que não teriam significado devido à alta ocorrência de palavras comuns sem significado significativo. Quando você constrói sua matriz de contagem, a normalização também é importante, pois permite adicionar peso a uma palavra com baixa ocorrência no conjunto de dados, mas com alta ocorrência em amostras específicas. Essas palavras são significativas e você não quer perdê-las. Também reduz pesos de palavras com altas ocorrências em todas as amostras em particular (quase para interromper a palavra, mas para palavras que podem ter um pouco de significado). Uma última coisa que notei ser importante não é imprimir as 10 principais palavras dos seus clusters, mas uma seleção mais extensa. Geralmente, a qualidade e a relevância das palavras-chave em relação ao rótulo que você daria ao cluster tendem a reduzir drasticamente após essas 10 a 20 palavras principais. Portanto, uma visão ampliada das principais palavras-chave o ajudará a analisar se seu cluster é realmente relevante ou muito poluído por ruído.

Vincent Teyssier
fonte
2

Meu método favorito é o LDA ; você pode procurar aqui um tutorial usando pacotes python.

Você também pode olhar para métodos muito mais simples como este .

omerbp
fonte