Pergunta

cadeias de Markov são uma forma (quase padrão) para gerar aleatória jargão que parece inteligente para olho destreinado. Como você iria sobre a identificação de Markov texto gerado a partir de texto escrito humana.

Seria fantástico se os recursos que apontam para são Python amigável.

Foi útil?

Solução

Você pode usar uma abordagem de "força bruta", em que você comparar a linguagem gerada com dados coletados em n-gramas de ordem mais elevada do que o modelo Markov que o gerou.

i. Se o idioma foi gerado com um modelo de Markov 2ª ordem, até 3-gramas vão ter as frequências corretas, mas de 4 gramas provavelmente não irá.

Você pode obter até freqüências de 5 gramas de público do Google n-gram dataset é enorme embora - 24G comprimido - você precisa para obtê-lo por via postal em DVDs a partir de LDC .

Editar: Adicionado alguns detalhes de implementação

Os n-gramas já foram contadas, assim você só precisa armazenar as contagens (ou frequências) de uma forma que é rápido de pesquisa. A indexados adequadamente banco de dados, ou talvez um índice Lucene deve funcionar.

Dado um pedaço de texto, varredura através dele e olhar para cima a freqüência de cada 5 gramas em seu banco de dados, e ver onde ele classifica em comparação com outros 5-grams que começam com os mesmos 4 palavras.

Na prática, um obstáculo maior podem ser os termos de licenciamento do conjunto de dados. Usá-lo para uma aplicação comercial pode ser proibida.

Outras dicas

Uma abordagem simples seria ter um grande grupo de seres humanos ler o texto de entrada para você e ver se o texto faz sentido. Eu estou meio brincando, este é um problema complicado.

Eu acredito que este é um problema difícil, porque de cadeia Markov texto gerado vai ter um monte das mesmas propriedades de texto humano real em termos de frequência de palavras e relações simples entre a ordem das palavras.

As diferenças entre o texto real e texto gerados por uma cadeia de Markov estão em regras de alto nível de gramática e no significado semântico, que são difíceis de codificar programaticamente. O outro problema é que as cadeias de Markov são bons o suficiente no texto geração que às vezes vêm com gramatical e semanticamente declarações corretas.

Como um exemplo, aqui está um aforismo do kantmachine :

Hoje, ele iria se sentir convencido de que a vontade humana é livre; amanhã, considerando a cadeia indissolúvel natureza, ele ficaria em liberdade como um mera ilusão e declarar natureza ser tudo-em-tudo.

Enquanto esta cadeia foi escrito por um programa de computador, é difícil dizer que um ser humano nunca diria isso.

Eu acho que a menos que você pode nos dar detalhes mais específicos sobre o computador e texto gerado pelo homem e que expor diferenças mais óbvias será difícil de resolver isso usando programação de computadores.

Eu sugiro uma generalização da resposta de Evan: fazer um modelo Markov de sua própria e treiná-lo com um pedaço grande da (muito grande) de amostra que você está dado, reservando o resto da amostra como "dados de teste". Agora, ver o quão bem o modelo que você treinou faz nos dados de teste, por exemplo, com um teste qui-quadrado que irá sugerir situação em que "o ajuste é bom demais" (sugerindo os dados de teste é de fato gerado por este modelo), bem como aqueles em que o ajuste é muito ruim (sugerindo erro na estrutura do modelo - um sobre modelo -formadas com a estrutura errada faz um trabalho notoriamente ruim em tais casos).

É claro que ainda há muitas questões para calibração, tais como a estrutura do modelo - você está suspeitando de um modelo simples baseado em Ntuples de palavras e pouco mais, ou um mais sofisticado, com estados de gramática e similares. Felizmente, você pode calibrar as coisas muito bem, usando grandes corpora de uns conhecidos-a-ser-naturais de texto e você também geram-se com modelos de várias estruturas.

Uma abordagem diferente é usar nltk para analisar as frases que você é dado - um pequeno número de mis-parses é de se esperar, mesmo em texto naturais (como os seres humanos são imperfeitos e por isso é o analisador - não pode saber que a palavra X pode ser usado como um verbo e apenas classificá-lo como um substantivo, etc, etc), mas a maioria dos modelos de Markov (a menos que eles estão modelando essencialmente a mesma estrutura gramatical seu analisador passa a estar usando - e você pode usar vários analisadores para tentar neutralizar isso -!) fará muito mais mis-parses do que até mesmo os seres humanos disléxicas. Mais uma vez, calibre que na naturais vs textos sintéticos, e você verá o que quero dizer! -)

Se você tivesse vários textos grandes Markov gerados, você poderia determinar que eles eram tão comparando as freqüências de palavra entre cada uma das amostras. Desde cadeias de Markov dependem de probabilidades palavra constantes, as proporções de qualquer palavra deve ser aproximadamente igual de amostra para amostra.

Crowdsourcing. Use Mechanical Turk e obter um número de seres humanos a votação sobre isso. Há mesmo algumas bibliotecas para ajudá-lo a conseguir isso. Por exemplo:

Aqui está um post de blog de O'Reilly Radar on dicas para usar Mechanical Turk para obter o seu trabalho feito:

Se você escreve um programa que gera probabilidades de transição de Markov de qualquer seqüência de símbolos e, em seguida, calcula a taxa de entropia da matriz de Markov. (Veja http://en.wikipedia.org/wiki/Entropy_rate#Entropy_rates_for_Markov_chains ) Este é basicamente uma estimativa de quão facilmente o texto poderia ser previsto usando apenas a cadeia de Markov (meios de entropia maiores mais difícil para prever). Portanto, eu acho que quanto menor a entropia da matriz de Markov é, o mais provável é que a amostra de texto é controlado por um Markov matriz. Se você tiver dúvidas sobre como escrever este código, por acaso tenho um programa em python que faz exatamente isso no meu computador, para que eu possa ajudá-lo

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