Pergunta

Eu quero implementar algumas aplicações com n-gramas (de preferência em PHP).


Que tipo de n-gramas é mais adequada para a maioria dos fins? A nível de palavra ou de um nível de personagem n-gram? Como você poderia implementar um n-gram-tokenizer em PHP?


Em primeiro lugar, gostaria de saber o que N-gramas são exatamente. Isso é correto? É assim que eu entendo n-gramas:

sentença: "Eu moro em NY"

bigramas nível de palavra (2 para n): "# I', "eu vivo", "in vivo", "em NY", 'NY #'

bigramas nível de caracteres (2 para n): "#I", "I #", "#l", "li", "iv", "ve", "e #", "#i", "em ", "n #", "#N", "NY", "Y #"

Quando você tem essa matriz de n-gram-peças, você deixa cair os duplicados e adicionar um contador para cada parte dando a frequência:

bigramas nível de palavra: [1, 1, 1, 1, 1]

bigramas Nível da personagem: [2, 1, 1, ...]

É este correto?


Além disso, eu gostaria de aprender mais sobre o que você pode fazer com n-gramas:

  • Como posso identificar o idioma de um texto usando n-gramas?
  • É possível fazer a tradução automática usando n-gramas, mesmo se você não tiver um corpus bilíngue?
  • Como posso construir um filtro de spam (spam, presunto)? Combine n-gramas com um filtro Bayesian?
  • Como posso fazer manchas tema? Por exemplo: é um texto sobre basquete ou cães? Minha abordagem (faça o seguinte com um artigo da Wikipedia para "cães" e "basquete"): construir os vetores n-gram para ambos os documentos, normalizá-los, calcular Manhattan / distância Euclidiana, quanto mais próximo o resultado é a 1 maior é a similaridade

O que você pensa sobre a minha candidatura se aproxima, especialmente o último?


Eu espero que você possa me ajudar. Agradecemos antecipadamente!

Foi útil?

Solução

Word n-gramas será geralmente mais útil para a maioria das aplicações de análise de texto que você menciona, com a possível exceção de detecção de idioma, onde algo como trigramas personagem pode dar melhores resultados. Efetivamente, você criaria vector n-gram para um corpus de texto em cada idioma que você está interessado em detectar e em seguida, comparar as freqüências de trigramas em cada corpus para os trigramas do documento que você está classificando. Por exemplo, o the trigrama provavelmente aparece com muito mais freqüência em Inglês do que em alemão e iria fornecer algum nível de correlação estatística. Depois de ter seus documentos em formato de n-gram, você tem uma escolha de muitos algoritmos para uma análise mais aprofundada, Filtros Baysian, N- vizinho mais próximo, Support Vector Machines, etc ..

Entre os aplicativos que você menciona, a tradução automática é provavelmente o mais improvável, como n-gramas por si só não vai lhe trazer muito longe no caminho. Converter um arquivo de entrada para uma representação n-grama é apenas uma maneira de colocar os dados em um formato para análise posterior recurso, mas como você perde um monte de informações contextuais, não pode ser útil para a tradução.

Uma coisa que atente para, é que não é suficiente para criar um vetor [1,1,1,2,1] para um documento e um vetor [2,1,2,4] para outro documento , se as dimensões não correspondem. Ou seja, a primeira entrada no vector não pode ser the em um documento e is em outro ou os algoritmos não vai funcionar. Você vai acabar com vetores como [0,0,0,0,1,1,0,0,2,0,0,1] como a maioria dos documentos não conterá mais n-gramas que você está interessado. Este 'revestimento up' de recursos é essencial, e isso requer que você decidir 'com antecedência' o que ngrams você estará incluindo em sua análise. Muitas vezes, isso é implementado como um algoritmo de duas passagens, a primeira a decidir a significância estatística de vários n-gramas para decidir o que manter. Google 'seleção de recursos' para mais informações.

Word baseado n-gramas mais Support Vector Machines em uma excelente maneira de realizar manchas tópico, mas você precisa de um grande corpus de texto pré classificados em 'sobre o tema' e 'off topic' para treinar o classificador. Você vai encontrar um grande número de trabalhos de pesquisa que explicam várias abordagens para este problema em um site como CiteSeerX . Eu não recomendaria a abordagem distância euclidiana para este problema, uma vez que não peso individual n-gramas com base na significância estatística, assim dois documentos que ambos incluem the, a, is e of seria considerado um jogo melhor do que dois documentos que ambos incluídos Baysian. Removendo palavras-stop de seus n-gramas de interesse iria melhorar isso um pouco.

Outras dicas

Você está correto sobre a definição de n-gramas.

Você pode usar o nível de palavra n-gramas para aplicações de pesquisa de tipo. Nível da personagem n-gramas pode ser usado mais para a análise do próprio texto. Por exemplo, para identificar o idioma de um texto, gostaria de usar as frequências das letras em comparação com as frequências estabelecidas da língua. Ou seja, o texto deve cerca de coincidir com a frequência de ocorrência de letras nessa língua.

tokenizer um N-gram para palavras em PHP pode ser feito usando strtok:

http://us2.php.net/manual/en/function .strtok.php

Para caracteres usar dividido:

http://us2.php.net/manual/en /function.str-split.php

Depois, é só dividir a matriz como você gostaria de qualquer número de n-gramas.

filtros Bayesian precisam ser treinados para o uso como filtros de spam, que podem ser usados ??em combinação com n-gramas. No entanto, você precisa dar-lhe uma abundância de entrada para que ele para aprender.

A sua última abordagem soa decente, tanto quanto aprender o contexto de uma página ... isso ainda é no entanto bastante difícil de fazer, mas n-gramas soa como um bom ponto de partida para fazê-lo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top