Pergunta

Eu gostaria de implementar análise semântica latente (LSA) em PHP, a fim de descobrir tópicos / tag para textos.

Aqui está o que eu acho que tem que fazer. Esta é correto? Como posso código em PHP? Como faço para determinar quais palavras para escolheu?

Eu não quero usar qualquer bibliotecas externas. Já uma implementação para a decomposição singular do valor (SVD) .

  1. Extrair todas as palavras do texto dado.
  2. Peso das palavras / frases, por exemplo, com tf-idf . Se ponderação é muito complexo, basta ter o número de ocorrências.
  3. Construir uma matriz: As colunas são alguns documentos do banco de dados (quanto mais, melhor?), As linhas são todas as palavras únicas, os valores são os números de ocorrências ou o peso
  4. .
  5. Faça o decomposição singular do valor (SVD).
  6. Use os valores na matriz S (SVD) para fazer a redução de dimensão (como?).

Eu espero que você possa me ajudar. Muito obrigado antecipadamente!

Foi útil?

Solução

ligações LSA:

Aqui está o algoritmo completo. Se você tem SVD, que são a maior parte do caminho até lá. Os documentos acima explicar melhor do que eu.

Pressupostos:

  • sua função SVD dará os valores singulares e vetores singulares em ordem decrescente. Se não, você tem que fazer mais acrobacias.

M : matriz corpus, W (palavras) por d (documentos) (w filas, colunas d). Estes podem ser contagens brutas, ou tfidf ou qualquer outra coisa. Stopwords pode ou não pode ser eliminado, e decorrente pode acontecer (Landauer diz stopwords guardar e não resultam, mas sim para tfidf).

U,Sigma,V = singular_value_decomposition(M)

U:  w x w
Sigma:  min(w,d) length vector, or w * d matrix with diagonal filled in the first min(w,d) spots with the singular values
V:  d x d matrix

Thus U * Sigma * V = M  
#  you might have to do some transposes depending on how your SVD code 
#  returns U and V.  verify this so that you don't go crazy :)

Em seguida, a reductionality .... o papel LSA real sugere uma boa aproximação para a base é manter vetores suficiente tal que os seus valores singulares são mais de 50% do total dos valores singulares.

Mais sucintamente ... (pseudocódigo)

Let s1 = sum(Sigma).  
total = 0
for ii in range(len(Sigma)):
    val = Sigma[ii]
    total += val
    if total > .5 * s1:
        return ii

Isso irá retornar o posto da nova base, que era min (d, w) antes, e vamos agora aproximar com {ii}.

(aqui, '-> privilegiada, não transposta)

Nós criar novas matrizes: U 'Sigma', V', com tamanhos w x ii, ii x ii e ii x d.

Essa é a essência do algoritmo LSA.

Esta matriz U resultante '* Sigma' * V' pode ser usado para 'melhoradas' busca cosseno de similaridade, ou você pode escolher o top 3 palavras para cada documento em que, por exemplo. Se este yeilds mais do que um simples tf-idf é uma questão de algum debate.

Para mim, realiza LSA mal em conjuntos de dados do mundo real por causa da polissemia e conjuntos de dados com muitos tópicos. É base matemática / probabilística não é sólido (assume distribuições-ish normal (Gauss), o que fazer não faz sentido para contagem de palavras).

Sua milhagem certamente irá variar.

Marcação usando LSA (um método!)

  1. construo a 'Sigma' U' matrizes dimensionalmente reduzidas utilizando SVD e uma redução heurística

  2. Ao lado, olhar sobre a matriz U', e chegar a termos que descrevem cada 'tópico'. Por exemplo, se os a maiores partes desse vector eram "Bronx, Yankees, Manhattan", depois "New York City" pode ser um termo bom para ele. Mantenha isso em uma matriz associativa, ou lista. Este passo deve ser razoável, já que o número de vetores será finito.

  3. Supondo que você tenha um vetor (v1) de palavras de um documento, em seguida, v1 * t (U ') dará mais fortes 'temas' para esse documento. Selecione a 3 maior, em seguida, dar seus "temas", calculado na etapa anterior.

Outras dicas

Esta resposta não é directamente à pergunta dos cartazes, mas a questão meta de como marca de formatação automática notícias. O OP menciona Named Entity Recognition, mas acredito que algo média mais ao longo da linha de codificação automática. Se eles NER realmente significa, então esta resposta é besteira:)

Tendo em conta estes constrangimentos (600 itens / dia, 100-200 caracteres / itens) com fontes divergentes, aqui estão algumas opções de marcação:

  1. Por mão. Um analista poderia facilmente fazer 600 destes por dia, provavelmente em um par de horas. Algo como Mechanical Turk da Amazon, ou fazendo os usuários fazê-lo, também pode ser viável. Ter algum número de "mão-tag", mesmo que seja apenas 50 ou 100, será uma boa base para comparar o que quer que os métodos Autogenerated abaixo te pegar.

  2. reduções Dimentionality, usando LSA, de Tópico-Models (latente Dirichlet de alocação), e afins .... Eu tive sorte realmente pobre com LSA em conjuntos de dados do mundo real e eu estou insatisfeito com a sua base estatística. LDA I encontrar muito melhor, e tem um incrível mailing list que tem o melhor pensamento sobre a forma de tópicos atribuir a textos.

  3. heurísticas simples ... se você tiver notícias reais, em seguida, exploram a estrutura da notícia . Foco na primeira frase, jogar fora todas as palavras (palavras de parada) e selecionar os melhores 3 substantivos das duas primeiras frases. Ou Parreira, tomar todas as substantivos na primeira frase, e ver onde que você recebe. Se os textos são todos em Inglês, em seguida, fazer parte da análise de discurso sobre a coisa toda, e ver o que que você recebe. Com itens estruturados, como notícias, LSA e outros métodos independentes de ordem (TF-IDF) joga fora uma grande quantidade de informações.

Boa sorte!

(se você gosta de esta resposta, talvez retag a questão de se encaixar)

Que todos os olhares para a direita, até a última etapa. A notação habitual para SVD é que ele retorna três matrizes A = USV *. S é uma matriz diagonal (ou seja, todos zero fora da diagonal) que, neste caso, basicamente, dá uma medida da quantidade de cada dimensão de captura os dados originais. Os números ( "valores singulares") vai para baixo, e você pode olhar para um drop-off para quantas dimensões são úteis. Caso contrário, você vai querer basta escolher um número arbitrário N para quantas dimensões tomar.

Aqui eu fico um pouco confuso. As coordenadas dos termos (palavras) no espaço reduzida dimensão é ou em U ou V, penso, dependendo se eles estão nas linhas ou colunas da matriz de entrada. Off lado, acho que as coordenadas para as palavras serão as linhas de U. ou seja, a primeira linha de U corresponde à primeira linha da matriz de entrada, ou seja, a primeira palavra. Então você acabou de dar os primeiros N colunas desta linha como a palavra é de coordenadas no espaço reduzido.

HTH

Update:

Este processo até agora não lhe diz exatamente como escolher tags. Eu nunca ouvi falar de alguém usando LSI para escolher tags (um algoritmo de aprendizado de máquina poderia ser mais adequado para a tarefa, como, por exemplo, árvores de decisão). LSI informa se duas palavras são semelhantes. Isso é um longo caminho desde a atribuição de tags.

Existem duas tarefas-a) que são o conjunto de tags de usar? b) como escolher os melhores três tags ?. Eu não tenho muita noção de como LSI vai ajudá-lo a responder a (a). Você pode escolher o conjunto de tags manualmente. Mas, se você estiver usando LSI, as tags provavelmente devem ser palavras que ocorrem nos documentos. Então, para (b), você quer escolher as marcas que estão mais próximos de palavras encontradas no documento. Você poderia experimentar algumas formas de implementar isso. Escolha as três marcas que estão mais próximos de qualquer palavra no documento, em que a proximidade é medida pela semelhança cosseno (ver Wikipedia) entre o tag é coordenada (sua linha em U) e da palavra coordenada (sua linha em U).

Não é uma discussão SO adicionais sobre os perigos de se fazer isso tudo em PHP em texto .

Especificamente, há um link lá para este papel na semântica latente Mapeamento , que descreve como obter as resultantes "tópicos" para um texto.

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