[ad_1]
Deseja compartilhar seu conteúdo com R-blogueiros? clique aqui se você tiver um blog ou aqui se não tiver.
Contents
Introdução
Este post apresenta métodos baseados em corpus para avaliar a eficácia de modelos de espaço vetorial na captura de relações semânticas. Aqui, consideramos a ferramenta de avaliação padrão para VSMs: o método offset para resolver analogias de palavras. Embora este método não exista sem suas limitações / críticas (consulte Lentilhas (2016) para uma discussão muito agradável), nosso foco aqui é um fluxo de trabalho baseado em R.
As porcas / parafusos desses tipos de avaliação geralmente podem ser encobertos na literatura da PNL; aqui descompactamos métodos e trabalhamos com alguns exemplos reproduzíveis. Por fim, nosso objetivo é entender como os parâmetros padrão do VSM (por exemplo, dimensionalidade e tamanho da janela) afetam a eficácia do modelo, especificamente para corpos pessoais e / ou não padronizados.
Corpus e modelo
O corpus usado aqui para demonstração é derivado de textos disponibilizados pelo Projeto Gutenberg. Amostramos o corpus completo do PG para criar um sub corpus mais gerenciável de ~ 7K textos e 250M de palavras. Uma descrição simples de sua construção está disponível aqui.
library(tidyverse)
setwd('/home/jtimm/jt_work/GitHub/data_sets/project_gutenberg')
corpus
O tipo de modelo de espaço vetorial (VSM) implementado é um modelo GloVe; o pacote R text2vec
é utilizado para construir esse espaço semântico. Abaixo dois text2vec
primitivas de dados são criadas: um iterador e um vocabulário vetorizado. Veja esta vinheta para uma descrição mais detalhada dos text2vec
estrutura.
t2v_itokens
Avaliação e analogia
Usamos dois conjuntos de problemas de analogia para avaliação do VSM: o conjunto de dados padrão do Google (Mikolov et al. 2013) e o conjunto BATS (Gladkova, Drozd e Matsuoka 2016). Consulte este breve apêndice para obter detalhes adicionais sobre os conjuntos de problemas, incluindo tipos e exemplos de categorias. Consulte este apêndice para obter um código simples de como criar seus próprios conjuntos de problemas de analogia – compatível com a estrutura com o conjunto de dados do Google e os text2vec
estrutura.
Eu armazenei esses arquivos no Git Hub, mas ambos são facilmente acessíveis online. Importante observar que o arquivo do Google não foi modificado de forma alguma; o arquivo BATS, por outro lado, foi reestruturado na imagem do arquivo do Google.
questions_file
## INFO [20:30:08.056] 11779 full questions found out of 19544 total
bats_analogy_set
## INFO [20:30:08.502] 39378 full questions found out of 56036 total
tests
Longo e curto do método de deslocamento vetorial aplicado a problemas de analogia. Por alguma analogia definida como (1) abaixo:
(1) a:a* :: b:__
onde a = Platão, a * = Grego eb = Copérnico, resolvemos b * como
(2) b* = a* - a + b
com base no pressuposto de que:
(3) a* - a = b* - b
Em outras palavras, supomos que o deslocamento de vetor entre dois conjuntos de palavras relacionadas semanticamente de maneira semelhante seja consistente quando plotado no espaço 2d semântico. Resolver para b *, portanto, equivale a identificar a palavra cuja representação vetorial é mais semelhante (por similaridade de cosseno) a a * – a + b (excluindo a *, a ou b).
Configuração experimental
Parâmetros
Portanto, para avaliar os efeitos do tamanho e da dimensionalidade da janela na eficácia de um modelo GloVe na solução de analogias, construímos um total de 50 modelos GloVe – ou seja, todas as combinações de tamanhos de janelas 3:12 e dimensões do modelo em (50, 100, 150, 200, 250)
p_windows
Fluxo
O desagradável for
O loop abaixo pode ser traduzido nos termos do leigo como: para o tamanho da janela j e dimensões k, (1) construir o modelo GloVe jk através da text2vec::GlobalVectors
e, em seguida, (2) testar a precisão do modelo GloVe jk através da text2vec::check_analogy_accuracy
.
for(j in 1:length(p_windows)) {
tcm
Estrutura de saída
As respostas ao teste de analogia são resumidas como uma lista de quadros de dados – um para cada um dos nossos 50 modelos GloVe.
names(results) %
bind_rows(.id = 'model')
Os componentes de teste foram hash (por text2vec
) para acelerar o processo de “classificação” – aqui, cruzamos as coisas de volta ao texto real.
key %
mutate(id = row_number()) %>%
select(id, term)
tests_df %
bind_rows() %>%
mutate(aid = row_number())
tests_df$X1
Em seguida, juntamos os dados de teste e resposta para criar uma tabela de dados legível e única.
predicted_actual %
group_by(window, dimensions) %>%
mutate(aid = row_number()) %>%
ungroup() %>%
left_join(key, by = c('predicted' = 'id')) %>%
rename(predicted_term = term) %>%
left_join(key, by = c('actual' = 'id')) %>%
rename(actual_term = term) %>%
left_join(tests_df %>% select(aid, X1:X3)) %>%
na.omit %>%
mutate(correct = ifelse(predicted == actual, 'Y', 'n'))
Uma amostra desta tabela é apresentada abaixo. respostas incorretas são geralmente mais interessantes.
Resultados: parâmetros do modelo
Nossa métrica de desempenho para um determinado modelo, portanto, é a porcentagem de respostas de analogia corretas ou precisão de analogia. As pontuações de precisão por dimensões, tamanho da janela e categoria de conjunto de dados / analogia são calculadas abaixo.
mod_category_summary %
mutate(correct = ifelse(predicted == actual, 'Y', 'N')) %>%
mutate(dset = ifelse(grepl('gram', category), 'google', 'bats')) %>%
group_by(dset, dimensions, window, category, correct) %>%
summarize(n = n()) %>%
ungroup() %>%
spread(correct, n) %>%
mutate(N = as.integer(N),
Y = as.integer(Y),)
Efeito de dimensionalidade do vetor
mod_summary %
filter(!is.na(Y)) %>% #
group_by(dset, window, dimensions) %>%
summarize(N = sum(N), Y = sum(Y)) %>%
ungroup() %>%
mutate (per = round(Y/(N+Y) *100, 1))
O gráfico abaixo ilustra a relação entre a precisão da analogia e o número de dimensões do modelo em função do tamanho da janela, facetada pelo conjunto de analogias. Por parcela, o modelo GloVe ganha no platô de desempenho de analogia em 150 dimensões para todos os tamanhos de janela; em vários casos, a precisão diminui em dimensões> 150. Além disso – a coleção de analogias do BATS parece ser um pouco mais desafiadora.
mod_summary %>%
ggplot() +
geom_line(aes(x = dimensions,
y = per,
color = factor(window),
linetype = factor(window)), size = 1) +
facet_wrap(~dset) +
theme_minimal() +
ggthemes::scale_color_stata() +
theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
theme(legend.position = 'right') +
ylab('Accuracy (%)') + xlab("Dimensions") +
labs(title = 'Accuracy (%) versus # Dimensions')
Efeito Tamanho da janela
O gráfico abaixo ilustra a relação entre a precisão da analogia e o tamanho da janela em função da dimensionalidade. Aqui, o desempenho do modelo melhora a cada aumento do tamanho da viúva – a precisão parece melhorar substancialmente dos tamanhos de janela 8 a 9. Além disso, algumas evidências de um nivelamento nos tamanhos de janela> 9 para modelos de maior dimensão.
O modelo mais simples e com melhor desempenho, então, para esse corpus específico (no agregado) é um tamanho da janela = 10 e dimensões = 150 modelo.
mod_summary %>%
ggplot() +
geom_line(aes(x = window,
y= per,
color = factor(dimensions),
linetype = factor(dimensions)
),
size = 1.25) +
facet_wrap(~dset) +
theme_minimal() +
ggthemes::scale_color_few() +
scale_x_continuous(breaks=c(3:12)) +
theme(legend.position = 'right') +
ylab('Accuracy (%)') + xlab("Window Size") +
labs(title = 'Accuracy (%) versus Window Size')
Resultados: categorias de analogia
Em seguida, desagregamos a eficácia do modelo por categoria de analogia e tamanho da janela, mantendo a dimensionalidade constante em 150. Os resultados para cada conjunto de problemas de analogia são visualizados como “mapas de calor” lado a lado; dark green
indica maior precisão dentro de uma categoria específica, dark brown
menor precisão. As pessoas observaram anteriormente na literatura que tamanhos menores de janelas tendem a ser melhores na captura de relações de natureza mais semântica (em oposição a mais gramaticais). Alguma evidência para isso aqui.
Conjunto de analogias do Google
mod_category_summary %>%
filter(!grepl('_', category)) %>%
filter(dimensions == 150) %>%
mutate(per = round(Y/(N+Y) *100, 1)) %>%
filter(!is.na(per)) %>%
group_by(category) %>%
mutate(rank1 = rank(per)) %>%
ungroup() %>%
ggplot(aes(x = factor(window), y = category)) +
geom_tile(aes(fill = rank1)) +
geom_text(aes(fill = rank1, label = per), size = 3) +
scale_fill_gradient2(low = scales::muted("#d8b365"),
mid = "#f5f5f5",
high = scales::muted('#5ab4ac'),
midpoint = 5) +
theme(legend.position = 'none') +
xlab('WINDOW SIZE') +
ggtitle('Google analogies: accuracy by category')
Conjunto de analogias BATS
mod_category_summary %>%
filter(grepl('_', category)) %>%
filter(dimensions == 150) %>%
mutate(per = round(Y/(N+Y) *100, 1),
category = gsub('^.*/','', category)) %>%
filter(!is.na(per)) %>%
group_by(category) %>%
mutate(rank1 = rank(per)) %>%
ungroup() %>%
ggplot(aes(x = factor(window), y = category)) +
geom_tile(aes(fill = rank1)) +
geom_text(aes(fill = rank1, label = per), size = 3) +
scale_fill_gradient2(low = scales::muted("#d8b365"),
mid = "#f5f5f5",
high = scales::muted('#5ab4ac'),
midpoint = 5) +
theme(legend.position = 'none') +
xlab('WINDOW SIZE') +
ggtitle('BATS analogies: accuracy by category')
Visualizando Deslocamentos de Vetor
Modelo GloVe em duas dimensões
Para fins de demonstração, usamos um espaço semântico derivado do tamanho da janela = 5 e dimensões = 100 Modelo GloVe. Esse espaço é transformado de 100 dimensões GloVe para duas dimensões através da análise de componentes principais.
pca_2d %
pluck(5) %>%
data.frame() %>%
select(PC1, PC2)
Uma vista de 30.000 pés deste espaço semântico bidimensional.
ggplot(data = pca_2d,
aes(x = PC1,
y = PC2)) +
geom_point(size = .05, color = 'lightgray') +
geom_text(data = pca_2d,
aes(x = PC1,
y = PC2,
label = rownames(pca_2d)),
size = 3,
color = 'steelblue',
check_overlap = TRUE) +
xlim (-2.5,2.5) + ylim(-2.5,2.5) +
theme_minimal()
Copérnico e Platão
x1 = 'copernicus'; x2 = 'polish'; y1 = 'plato'; y2 = 'greek'
y
Por fim, uma demonstração visual do método de deslocamento vetorial em andamento na solução do Analogia de Copernicus problema. Situado dentro do espaço semântico completo para o contexto.
ggplot(data = pca_2d,
aes(x = PC1,
y = PC2)) +
geom_text(data = pca_2d,
aes(x = PC1,
y = PC2,
label = rownames(pca_2d)),
size = 3,
color = 'gray',
check_overlap = TRUE) +
xlim(min(c(off_dims$x1, off_dims$x2)),
max(c(off_dims$x1, off_dims$x2))) +
ylim(min(c(off_dims$y1, off_dims$y2)),
max(c(off_dims$y1, off_dims$y2))) +
geom_segment(data = off_dims[1:2,],
aes(x = x2, y = y2,
xend = x1, yend = y1),
color = '#df6358',
size = 1.25,
arrow = arrow(length = unit(0.025, "npc"))) +
geom_segment(data = off_dims[3:4,],
aes(x = x1, y = y1,
xend = x2, yend = y2),
color = 'steelblue',
size = 1.25,
#linetype = 4,
arrow = arrow(length = unit(0.025, "npc"))) +
ggrepel::geom_text_repel(
data = y,
aes(label = toupper(rownames(y))),
direction = "y",
hjust = 0,
size = 4.25,
color = 'black') +
theme_minimal() +
ggtitle(paste0(x1, ':', x2, ' :: ', y1, ':', y2))
Resumo e advertências
Principalmente uma desculpa para reunir alguns pensamentos. Eu uso bastante os modelos GloVe para fins exploratórios. Para confiar melhor nas idéias obtidas com a exploração, geralmente é bom ter uma ferramenta de avaliação, por mais imperfeita que seja. E certamente para justificar a seleção de parâmetros para tarefas específicas de corpus. Espero que seja útil
recurso e guia. Para algumas aplicações inovadoras e mais criteriosas dos VSMs, consulte
Weston et al. (2019) e Tshitoyan et al. (2019).
Referências
Gladkova, Anna, Aleksandr Drozd e Satoshi Matsuoka. 2016. “Detecção baseada em analogia de relações morfológicas e semânticas com incorporação de palavras: o que funciona e o que não funciona.” No Anais do Workshop de Pesquisa de Estudantes de Naacl8-15.
Linzen, Tal. 2016. “Problemas na avaliação de espaços semânticos usando analogias de palavras.” arXiv Preprint arXiv: 1606.07736.
Mikolov, Tomas, Kai Chen, Greg Corrado e Jeffrey Dean. 2013. “Estimativa eficiente de representações de palavras no espaço vetorial.” arXiv Preprint arXiv: 1301.3781.
Tshitoyan, Vahe, John Dagdelen, Leigh Weston, Alexander Dunn, Ziqin Rong, Olga Kononova, Kristin A Persson, Gerbrand Ceder e Anubhav Jain. 2019. “Incorporação de palavras não supervisionadas captura conhecimento latente da literatura sobre ciência de materiais”. Natureza 571 (7763): 95-98.
Weston, Leigh, Vahe Tshitoyan, John Dagdelen, Olga Kononova, Amalie Trewartha, Kristin A. Persson, Gerbrand Ceder e Anubhav Jain. 2019. “Reconhecimento e normalização de entidades nomeadas aplicadas à extração de informações em larga escala da literatura sobre ciência de materiais”. Revista de Informação e Modelagem Química 59 (9): 3692-3702.
Relacionado
[ad_2]