Identificando modelos com parâmetros em fragmentos de texto

7

Eu tenho um conjunto de dados com fragmentos de texto com uma estrutura fixa que pode conter parâmetros. Exemplos são:

 Temperature today is 20 centigrades
 Temperature today is 28 centigrades

ou

 Her eyes are blue and hair black.
 Her eyes are green and hair brown.

O primeiro exemplo mostra um modelo com um parâmetro numérico. O segundo é um modelo com dois parâmetros de fator.

O número de modelos e o número de parâmetros não é conhecido.

O problema é identificar os modelos e atribuir cada fragmento de texto ao modelo correspondente.

A primeira idéia óbvia é usar o clustering. A medida de distância é definida como um número de palavras não correspondentes. Ou seja, os registros no exemplo um têm distância 1, no exemplo duas distância é 2. A distância entre o registro no exemplo um e dois é 7. Essa abordagem funciona bem, desde que seja conhecido o número de clusters, o que não é o caso, portanto não é útil.

Eu posso imaginar uma abordagem programática que varre a matriz de distância procurando registros com muitos vizinhos na distância 1 (ou 2,3, ..), mas estou curioso para saber se posso aplicar algum algoritmo de aprendizado de máquina não supervisionado para resolver o problema. R é preferido, mas não obrigatório.

Marmite Bomber
fonte
11
Eu não sou especialista em PNL, por que você não consideraria fazer um LSA em todo o corpus e depois usar as pontuações correspondentes em um algoritmo de clustering? Isso resolveria facilmente o fato de que modelos diferentes têm parâmetros numéricos diferentes. Encontrar o número de clusters seguiria um procedimento metodológico padrão (por exemplo, -means / AIC). kk
usεr11852
@ usεr11852 Aprecio sua proposta, mas, curiosamente, obtenho melhores resultados usando a distância simples no TermDocumentMatrix (tm) do que com o LSA. Suponho que isso se deva à estrutura fixa dos meus modelos, por exemplo, a ordem dos termos é relevante para a distância. Suponho intuitivamente que deve haver uma solução elementar simples para o meu problema, provavelmente baseada na matriz da distância, mas fique à vontade para formular sua proposta como resposta, para que eu possa honrá-la.
Marmite Bomber
@ usεr11852 As dificuldades com o LSA foram causadas por: 1) problemas em ignorar termos curtos - o parâmetro wordLengths 2) aplicativo IDF não transformado. Eu adicionei uma resposta abordando os dois problemas.
Marmite Bomber

Respostas:

3

A lógica básica por trás da sugestão a seguir é associar "autovetores" e "modelos".

Em particular, pode-se usar o LSA em todo o corpus com base em um conjunto de palavras. Os vetores próprios resultantes serviriam como modelos substitutos; esses vetores próprios não devem ser diretamente afetados pelo número de palavras em cada modelo. Posteriormente, as pontuações poderiam ser usadas para agrupar os documentos, seguindo um procedimento padrão (por exemplo,ksignifica em conjunto com a AIC). Como alternativa ao LSA, pode-se usar o NNMF. Deixe-me salientar que o LSA (ou NNMF) provavelmente precisaria ser feito no TF-IDF transformado, em vez da matriz bruta de contagem de palavras.

usεr11852
fonte
Eu adicionei uma resposta baseada no IDF transformado para diferenciar os parâmetros e os termos do modelo. Como esse é o meu primeiro uso do IDF transformado, eu gostaria de comentar a abordagem.
Marmite Bomber
11
Estou feliz por poder ajudar.
usεr11852
3

Você pode usar o word2vec para identificar frases no corpus. A presença de uma frase (em vez de tokens únicos) provavelmente indica um 'modelo'.

A partir daqui, os tokens mais semelhantes à sua frase de modelo provavelmente serão os valores para seus parâmetros.

jamesmf
fonte
Obrigado pela sugestão. Isso funcionará bem no caso de a parte da correção (modelo) estar à frente, seguida pelos parâmetros. Reconhecerei "Temperatura hoje é" como uma frase, mas provavelmente terei problema em diferenciar se 20 e centígrados for parâmetro ou parte do modelo no meu exemplo.
Marmite Bomber
Verdadeiro - mas se você listar as palavras mais semelhantes a "A temperatura atual é", seria de esperar que "centrígrado" seja essencialmente o mesmo (e, portanto, parte do modelo), enquanto "20" (ou outros temps) será bastante semelhante, mas muito menos.
precisa saber é o seguinte
1

O script abaixo usa o LSA com IDF transformado para cortar os parâmetros dos modelos. A idéia é que todos os termos com IDF mais altos que algum limite sejam considerados parâmetros e que sua frequência seja zerada. O limite pode ser aproximado com a ocorrência média do modelo no corpus. Eliminando os parâmetros, a distância dos registros com o mesmo modelo é zero.

 library(tm)
 library(lsa)
 df <- data.frame(TEMPLATE = c(rep("A",3),rep("B",3),rep("C",3)),
 TEXT = c(
 paste("Temperature today is",c(28,24,20),"centigrades"),
 paste("Temperature today is",c(82,75,68),"Fahrenheit"),
 paste("Her eyes are ",c("blue","black","green"), "and hair",c("grey","brown","white"))) , stringsAsFactors=FALSE)
> df     
   TEMPLATE                                TEXT
 1        A Temperature today is 28 centigrades
 2        A Temperature today is 24 centigrades
 3        A Temperature today is 20 centigrades
 4        B  Temperature today is 82 Fahrenheit
 5        B  Temperature today is 75 Fahrenheit
 6        B  Temperature today is 68 Fahrenheit
 7        C    Her eyes are  blue and hair grey
 8        C  Her eyes are  black and hair brown
 9        C  Her eyes are  green and hair white

 corpus <- Corpus(VectorSource(df$TEXT))
 td <- as.matrix(TermDocumentMatrix(corpus,control=list(wordLengths = c(1, Inf)) ))

 > td             Docs
 Terms         1 2 3 4 5 6 7 8 9
   20          0 0 1 0 0 0 0 0 0
   24          0 1 0 0 0 0 0 0 0
   28          1 0 0 0 0 0 0 0 0
   68          0 0 0 0 0 1 0 0 0
   75          0 0 0 0 1 0 0 0 0
   82          0 0 0 1 0 0 0 0 0
   and         0 0 0 0 0 0 1 1 1
   are         0 0 0 0 0 0 1 1 1
   black       0 0 0 0 0 0 0 1 0
   blue        0 0 0 0 0 0 1 0 0
   brown       0 0 0 0 0 0 0 1 0
   centigrades 1 1 1 0 0 0 0 0 0
   eyes        0 0 0 0 0 0 1 1 1
   fahrenheit  0 0 0 1 1 1 0 0 0
   green       0 0 0 0 0 0 0 0 1
   grey        0 0 0 0 0 0 1 0 0
   hair        0 0 0 0 0 0 1 1 1
   her         0 0 0 0 0 0 1 1 1
   is          1 1 1 1 1 1 0 0 0
   temperature 1 1 1 1 1 1 0 0 0
   today       1 1 1 1 1 1 0 0 0
   white       0 0 0 0 0 0 0 0 1

 ## supress terms with idf higher than template frequency
 ## those terms are considered as parameters
 template_freq <- 3
 tdw <- lw_bintf(td) * ifelse(gw_idf(td)> template_freq,0, gw_idf(td))
 dist <- dist(t(as.matrix(tdw)))

 > dist
          1        2        3        4        5        6        7        8
 2 0.000000                                                               
 3 0.000000 0.000000                                                      
 4 3.655689 3.655689 3.655689                                             
 5 3.655689 3.655689 3.655689 0.000000                                    
 6 3.655689 3.655689 3.655689 0.000000 0.000000                           
 7 6.901341 6.901341 6.901341 6.901341 6.901341 6.901341                  
 8 6.901341 6.901341 6.901341 6.901341 6.901341 6.901341 0.000000         
 9 6.901341 6.901341 6.901341 6.901341 6.901341 6.901341 0.000000 0.000000

A matriz de distância mostra claramente que os registros 1,2,3 são do mesmo modelo (distância = 0, com os dados sintéticos; em um caso real, um pequeno limiar deve ser usado). O mesmo vale para os registros 4,5,6 e 7,8,9.

Marmite Bomber
fonte