N-gramas. Melhorando a otimização interna com a ajuda de concorrentes Veja o que é "N-gram" em outros dicionários

Usando N-gramas

Uso geral de N-gramas

  • extração de dados para agrupar uma série de imagens de satélite da Terra do espaço, a fim de decidir quais partes específicas da Terra estão na imagem,
  • pesquisa de sequências genéticas,
  • no campo da genética são usados ​​para determinar de quais espécies animais específicas amostras de DNA são coletadas,
  • na compressão do computador,
  • usando N-grams, como regra, os dados relacionados ao som são indexados.

N-grams também são amplamente utilizados no processamento de linguagem natural.

Usando N-grams para necessidades de processamento de linguagem natural

No campo do processamento de linguagem natural, os N-gramas são usados ​​principalmente para predição baseada em modelos probabilísticos. O modelo N-gram calcula a probabilidade da última palavra do N-gram se todas as anteriores forem conhecidas. Ao usar essa abordagem para modelar uma linguagem, assume-se que a aparência de cada palavra depende apenas das palavras anteriores.

Outra aplicação de N-grams é a detecção de plágio. Se você dividir o texto em vários pequenos fragmentos, representados por n-gramas, eles podem ser facilmente comparados entre si e, assim, obter o grau de semelhança dos documentos controlados. N-gramas são frequentemente usados ​​com sucesso para categorizar texto e idioma. Além disso, eles podem ser usados ​​para criar funções que permitem obter conhecimento de dados de texto. Usando N-grams pode-se encontrar eficientemente candidatos para substituir palavras com erros ortográficos.

Projetos de pesquisa do Google

Os centros de pesquisa do Google usaram modelos N-gram para uma ampla gama de pesquisa e desenvolvimento. Isso inclui projetos como tradução estatística de um idioma para outro, reconhecimento de fala, correção ortográfica, extração de informações e muito mais. Para esses projetos, foram utilizados textos corpora contendo vários trilhões de palavras.

O Google decidiu criar seu próprio prédio educacional. O projeto se chama Google teracorpus e contém 1.024.908.267.229 palavras coletadas de sites públicos.

Métodos para extrair n-gramas

Devido ao uso frequente de N-gramas para resolver diversos problemas, é necessário um algoritmo confiável e rápido para extraí-los do texto. Uma ferramenta de extração de n-gram adequada deve ser capaz de trabalhar com tamanho de texto ilimitado, trabalhar rapidamente e fazer uso eficiente dos recursos disponíveis. Existem vários métodos para extrair N-gramas do texto. Esses métodos são baseados em princípios diferentes:

Notas

Veja também


Fundação Wikimedia. 2010.

  • n-tv
  • N-caderina

Veja o que é "N-gram" em outros dicionários:

    GRAMA- (francês gramme, do grego gramma trait). unidade francesa. peso \u003d peso de 1 centímetro cúbico de água destilada \u003d 22,5 russo. ações. Dicionário de palavras estrangeiras incluído no idioma russo. Chudinov A.N., 1910. GRAM unidade de medida de peso na França ... Dicionário de palavras estrangeiras da língua russa

    grama- grama, gênero. pl. gramas e gramas permitidos (em discurso oral após numerais). Cem gramas (gramas). Em defesa da nova forma do gênero. caso pl. número de gramas foi feito por um conhecedor do escritor de língua russa K. Chukovsky. Aqui está o que ele escreveu no livro "Viver como Vida": ... ... Dicionário de dificuldades de pronúncia e estresse em russo moderno

    GRAMA- GRAM, grama, marido. (do grego gramma sign, letra). A unidade básica de peso no sistema métrico, igual ao peso de 1 centímetro cúbico de água. Um grama pesa cerca de 1/400 de uma libra. ❖ Gram átomo (phys.) o número de gramas de uma substância igual ao seu peso atômico. ... ... Dicionário explicativo de Ushakov

    grama-roentgen- raio-x de grama/n, raio-x de grama/on, haste. pl. grama roentgen e grama roentgen... mesclado. Separado. Através de um hífen.

    grama- Gram, esta simples palavra não poderia ter sido dada no dicionário de erros, a não ser por duas circunstâncias; em primeiro lugar, se você quiser se exibir com uma linguagem absolutamente correta, depois de chegar à loja, surpreenda o vendedor com a correta: Pese-me duzentos gramas (não ... ... Dicionário de erros do idioma russo

    GRAM-ÁTOMO- GRAM ÁTOMO, a quantidade de um elemento cuja massa, em gramas, é igual à sua MASSA ÁTOMO. Foi substituído pela unidade SI mol. Por exemplo, um grama de um átomo de hidrogênio (H, massa atômica = 1) é igual a um grama. b> EQUIVALENTE GRAMA, o peso em gramas disso… … Dicionário enciclopédico científico e técnico

    GRAMA- GRAM, ah, gênero. pl. gramas e gramas, marido. Uma unidade de massa no sistema decimal de medidas, um milésimo de um quilograma. Nem uma onça (não) de nada (coloquial) de jeito nenhum, de jeito nenhum. Este homem (não) tem um pingo de consciência. | adj. grama, oh, oh. Explicativo... ... Dicionário explicativo de Ozhegov

    grama- mas; pl. gênero. gramas e gramas; m. [francês. grama] Uma unidade de massa no sistema métrico, um milésimo de um quilograma. ◊ Não há (um único) grama. De jeito nenhum, de jeito nenhum. Em quem l. nem um pingo de falsidade. Ninguém tem um pingo de consciência. * * * gramas (francês ... dicionário enciclopédico

    Gramm Zenob Teófilo- (Gramme) (1826 1901), engenheiro eletricista. Nasceu na Bélgica, trabalhou na França. Recebeu uma patente para um gerador elétrico prático com uma armadura anular (1869). Fundou a produção industrial de máquinas elétricas. * * * GRAM Zenob… … dicionário enciclopédico

    átomo de grama- a quantidade de uma substância em gramas, numericamente igual à sua massa atômica. O termo não é recomendado para uso. No SI, a quantidade de uma substância é expressa em mols. * * * GRAM ATOM GRAM ATOM, a quantidade de uma substância em gramas, numericamente igual à sua massa atômica (ver ... dicionário enciclopédico

    molécula grama- a quantidade de uma substância em gramas, numericamente igual ao seu peso molecular. O termo não é recomendado para uso. No SI, a quantidade de uma substância é expressa em mols. * * * GRAM MOLECULE GRAM MOLECULE, a quantidade de uma substância em gramas, numericamente igual ao seu ... ... dicionário enciclopédico

Núcleo semântico

Para desenvolver com sucesso e aumentar a visibilidade do site nas realidades modernas, é necessário expandir constantemente o núcleo semântico. Uma das melhores maneiras de crescer é coletar palavras-chave dos concorrentes.

Hoje, não é difícil obter a semântica dos concorrentes, porque. Existem muitos serviços, pagos e gratuitos.

Lista gratuita:

— megaindex.ru — Ferramenta de visibilidade do site

- xtool.ru - um serviço conhecido que também mostra as palavras-chave para as quais o site é classificado

Lista de pagos:

— spywords.ru — adequado para Yandex e Google

- semrush.ru - focado apenas no Google

— prodvigator.ua — análogo ucraniano de spywords.ru

Além dos serviços, você também pode usar um método manual baseado na divisão do título e da descrição em n-grams, resultando na obtenção de uma lista adicional de frases na saída.

N-gram - uma sequência de n elementos. Na prática, o N-gram é mais comum como uma série de palavras. Uma sequência de dois elementos consecutivos é frequentemente chamada de digrama, uma sequência de três elementos é chamada trigrama. Pelo menos quatro ou mais elementos são designados como um N-grama, N é substituído pelo número de elementos consecutivos.

Considere esta técnica passo a passo:

- Carregar o título (descrição) dos concorrentes. Pode ser feito com Screaming Frog SEO.

- Em um editor de texto, limpamos a lista resultante de trechos de fala de serviço, sinais de pontuação e outros lixos. Eu uso a função "pesquisar e substituir" no texto sublime do editor de texto (tecla de atalho ctrl+H), usando expressões regulares:

- Selecione o n-gram desejado e defina a frequência para pelo menos um. A melhor opção são trigramas e 4 gramas:

- Obtemos o seguinte resultado:

Colunacontarmostra o número de repetiçõesn-grama, colunafrequência -frequêncian-gramas.

Após recebermos uma lista de frases, precisamos analisá-la e selecionar as palavras-chave apropriadas para expandir o núcleo semântico. Mais detalhes podem ser encontrados na seção relevante do nosso blog.

Solicitações de agrupamento

É muito importante entender como o núcleo semântico dos concorrentes é agrupado, pois isso ajuda a distribuir corretamente as frases-chave nas páginas do site.

Para fazer isso, depois de gerar uma lista completa de consultas, precisamos obter páginas e posições relevantes dos concorrentes (você pode usar o serviço seolib.ru) e comparar com nosso agrupamento. Se você perceber que um concorrente tem boas posições e ao mesmo tempo seu agrupamento difere do nosso (por exemplo, as solicitações de um concorrente são distribuídas em páginas diferentes, enquanto as nossas têm as mesmas solicitações em uma página), você precisa prestar atenção isso e revise as páginas de destino em seu site.

Vamos considerar um pequeno exemplo de comparação do agrupamento de um site condicional e seu concorrente.

Como você pode ver na tabela, site.ru tem uma página de destino para todas as palavras-chave. Em um concorrente, páginas diferentes são classificadas para as mesmas consultas e ocupam as posições TOP ou próximas das TOP. Com base nisso, podemos concluir que o agrupamento no site.ru precisa ser revisado, em particular, é necessário criar uma página separada para frases-chave com a palavra “fachada”.

Qualidade do texto

A primeira e mais importante coisa a se atentar ao analisar os textos dos concorrentes não é o componente quantitativo (número de ocorrências, tamanho do texto etc.), mas o qualitativo ou semântico - quão útil é a informação, o que o concorrente oferece e como ele faz isso.

Vejamos alguns exemplos.

Digamos que você está entregando flores e na página principal do texto você garante o frescor delas. Por exemplo, assim:

serviço de entrega de floreslocal. ptgarante a segurança dos buquês mesmo na estação fria.

Aqui está um exemplo de um dos concorrentes:

É lucrativo encomendar-nos composições perfumadas, porque garantimos uma garantia de reembolso de 100% se a frescura das flores estiver em dúvida.

A garantia de um concorrente é lastreada em dinheiro, o que é mais significativo do que uma garantia abstrata.

Considere outro exemplo - o texto na página da categoria "ladrilhos cerâmicos" de uma loja online:

Este texto não carrega nenhuma carga semântica útil, água sólida. Muito provavelmente, a pessoa que veio ao site e toma uma decisão de compra quer conhecer os benefícios do produto e as possíveis configurações, ao invés disso recebe um conjunto de caracteres sem sentido.

Agora vamos ver o texto de um concorrente:

Este texto é mais útil porque comunica sucintamente as diferenças entre os blocos e ajuda você a entender como escolher o caminho certo.

Assim, comparando os textos dos concorrentes com os seus, você pode obter muitas informações úteis que ajudarão os redatores na hora de compilar o TOR.

Relevância dos textos

Continuando o tema da qualidade dos textos, não se pode deixar de tocar em sua relevância. Hoje, para que o texto seja relevante, não basta apenas incluir palavras-chave. Para aumentar a relevância da página e ao mesmo tempo não tornar o texto spam, você precisa usar palavras relacionadas ao tema.

Ao avaliar a relevância de um texto para uma consulta, o mecanismo de busca analisa não apenas a presença de palavras-chave, mas também palavras adicionais, determinando assim o significado do texto. Por exemplo, se escrevermos um texto sobre um elefante, as palavras relacionadas podem ser consideradas: “tronco”, “presas”, “natureza”, “zoológico”. Se o texto sobre a peça de xadrez for “elefante”, essas palavras serão: “figura”, “xeque”, “rainha”, etc.

Você pode obter a lista de palavras mais adequada para suas necessidades nos textos dos concorrentes. Para fazer isso, você precisa seguir os seguintes passos:

— Copiamos todos os textos do TOP-10 para a solicitação de alta frequência desejada em diferentes arquivos de texto.

- Removemos trechos de fala, sinais de pontuação e números de textos (considerados anteriormente).

- Alinhe palavras em uma linha - use a função "pesquisar e substituir" com expressões regulares. Substitua o espaço por \n.

- Em seguida, você precisa trazer todas as formas de palavras para a forma normal do dicionário (lema). Para fazer isso, você pode usar o serviço https://tools.k50project.ru/lemma/. No campo, insira uma lista de palavras de cada arquivo separadamente e clique no botão "lemetizar e produzir como uma tabela csv". O resultado deve ser 10 arquivos com palavras lemetizadas.

- Em cada arquivo, removemos palavras duplicadas.

- Combine palavras de arquivos em uma lista.

— Agora precisamos criar um dicionário de frequência. Para fazer isso, adicione a lista resultante ao serviço https://tools.k50project.ru/lemma/ e clique em "construir um dicionário de frequência na forma de CSV".

- Nossa lista de palavras está pronta:

Se a frequência for 10, então esta palavra foi usada em todos os 10 sites, se 8, então apenas em 8, etc. Recomendamos usar as palavras mais frequentes, no entanto, soluções interessantes podem ser encontradas entre as palavras raras.

De uma maneira tão simples, você pode obter uma lista de palavras temáticas para compilar TOR para redatores.

Como você pode ver, os concorrentes são uma fonte muito importante de informações que podem ajudá-lo a otimizar melhor seus sites. Neste artigo, cobri todos os aspectos e, no futuro, continuarei a escrever sobre o que é útil e como você pode aprender com seus concorrentes.

Assine a newsletter Esses algoritmos são projetados para pesquisar em texto anteriormente desconhecido e podem ser usados, por exemplo, em editores de texto, visualizadores de documentos ou navegadores da Web para pesquisar em uma página. Eles não requerem pré-processamento de texto e podem funcionar com um fluxo contínuo de dados.

Pesquisa linear

Uma aplicação sequencial simples de uma determinada métrica (por exemplo, a métrica Levenshtein) às palavras do texto de entrada. Ao usar uma métrica com limite, esse método permite obter o desempenho ideal. Mas, ao mesmo tempo, quanto mais k, quanto maior o tempo de execução aumenta. Estimativa de tempo assintótica - O(kn).

Bitap (também conhecido como Shift-Or ou Baeza-Yates-Gonnet, e sua modificação de Wu-Manber)

Algoritmo bitap e suas várias modificações são mais frequentemente usadas para pesquisa difusa sem indexação. Sua variação é usada, por exemplo, no utilitário unix agrep , que executa funções semelhantes ao grep padrão , mas com suporte para erros na consulta de pesquisa e ainda oferece oportunidades limitadas para o uso de expressões regulares.

Pela primeira vez, a ideia deste algoritmo foi proposta por cidadãos Ricardo Baeza Yates E Gaston Gonnet, publicando um artigo relacionado em 1992.
A versão original do algoritmo lida apenas com substituições de caracteres e, na verdade, calcula a distância Hamming. Mas um pouco mais tarde sol wu E Udi Manber propôs uma modificação deste algoritmo para calcular a distância Levenshtein, ou seja trouxe suporte para inserções e exclusões, e desenvolveu a primeira versão do utilitário agrep baseado nele.






Valor do resultado

Onde k- número de erros, j- índice de caracteres, s x - máscara de caractere (na máscara, bits únicos estão localizados nas posições correspondentes às posições do caractere fornecido na solicitação).
Uma correspondência ou não correspondência com a consulta é determinada pelo último bit do vetor R resultante.

A alta velocidade deste algoritmo é garantida pelo paralelismo de bits dos cálculos - em uma operação é possível realizar cálculos em 32 ou mais bits simultaneamente.
Ao mesmo tempo, a implementação trivial suporta a busca de palavras com comprimento não superior a 32. Esta limitação é determinada pela largura do tipo padrão int(em arquiteturas de 32 bits). Você também pode usar tipos de grandes dimensões, mas isso pode retardar o algoritmo até certo ponto.

Apesar do fato de que o tempo de execução assintótico deste algoritmo O(kn)é o mesmo que o método linear, é muito mais rápido com consultas longas e o número de erros k mais de 2.

Teste

O teste foi realizado em um texto de 3,2 milhões de palavras, o comprimento médio das palavras foi de 10.
Pesquisa exata
Tempo de pesquisa: 3562 ms
Pesquise usando a métrica Levenshtein
Tempo de pesquisa em k=2: 5728ms
Tempo de pesquisa em k=5: 8385ms
Pesquise usando o algoritmo Bitap com modificações Wu-Manber
Tempo de pesquisa em k=2: 5499 ms
Tempo de pesquisa em k=5: 5928ms

Obviamente, uma pesquisa simples usando a métrica, diferentemente do algoritmo Bitap, é altamente dependente do número de erros. k.

No entanto, quando se trata de pesquisar grandes quantidades de texto inalterado, o tempo de pesquisa pode ser reduzido significativamente pelo pré-processamento desse texto, também chamado de indexação.

Algoritmos de pesquisa difusa com indexação (offline)

Uma característica de todos os algoritmos de busca difusa com indexação é que o índice é construído de acordo com um dicionário compilado a partir do texto fonte ou de uma lista de registros em um banco de dados.

Esses algoritmos usam diferentes abordagens para resolver o problema - alguns deles usam redução para busca exata, outros usam as propriedades da métrica para construir várias estruturas espaciais e assim por diante.

Primeiramente, na primeira etapa, é construído um dicionário a partir do texto fonte, contendo as palavras e suas posições no texto. Além disso, você pode contar as frequências de palavras e frases para melhorar a qualidade dos resultados da pesquisa.

Supõe-se que o índice, como o dicionário, esteja totalmente carregado na memória.

Características táticas e técnicas do dicionário:

  • Texto de origem - 8,2 gigabytes de materiais da biblioteca Moshkov (lib.ru), 680 milhões de palavras;
  • Tamanho do dicionário - 65 megabytes;
  • Número de palavras - 3,2 milhões;
  • O comprimento médio da palavra é de 9,5 caracteres;
  • Tamanho da palavra quadrática média (pode ser útil ao avaliar alguns algoritmos) - 10,0 caracteres;
  • Alfabeto - letras maiúsculas A-Z, sem E (para simplificar algumas operações). Palavras que contenham caracteres não alfabéticos não são incluídas no dicionário.
A dependência do tamanho do dicionário no volume de texto não é estritamente linear - até um certo volume, um quadro de palavras básico é formado, variando de 15% em 500 mil palavras a 5% em 5 milhões, e então a dependência se aproxima de linear , diminuindo lentamente e atingindo 0,5% em 680 milhões de palavras. A manutenção subsequente do crescimento é assegurada na maior parte por palavras raras.

Algoritmo de Expansão de Amostra

Esse algoritmo é frequentemente usado em sistemas de verificação ortográfica (ou seja, corretores ortográficos), onde o tamanho do dicionário é pequeno ou onde a velocidade não é o critério principal.
Baseia-se na redução do problema de busca difusa ao problema de busca exata.

A partir da consulta original, é construído um conjunto de palavras "errôneas", para cada uma das quais é realizada uma pesquisa exata no dicionário.

Seu tempo de execução depende fortemente do número k de erros e do tamanho do alfabeto A, e no caso de usar um dicionário binário a busca é:

Por exemplo, quando k = 1 e palavras de comprimento 7 (por exemplo, "Crocodilo") no alfabeto russo, o conjunto de palavras erradas terá cerca de 450 de tamanho, ou seja, será necessário fazer 450 consultas ao dicionário, o que é bastante aceitável.
Mas já em k = 2 o tamanho de tal conjunto será de mais de 115 mil opções, o que corresponde a uma enumeração completa de um pequeno dicionário, ou 1/27 no nosso caso, e, portanto, o tempo de execução será bastante grande. Ao mesmo tempo, não se deve esquecer que para cada uma dessas palavras é necessário procurar uma correspondência exata no dicionário.

Peculiaridades:
O algoritmo pode ser facilmente modificado para gerar variantes "errôneas" de acordo com regras arbitrárias e, além disso, não requer nenhum processamento preliminar do dicionário e, portanto, memória adicional.
Possíveis melhorias:
É possível gerar não todo o conjunto de palavras "errôneas", mas apenas aquelas com maior probabilidade de ocorrer em uma situação real, por exemplo, palavras levando em consideração erros comuns de ortografia ou digitação.

Esse método existe há muito tempo e é o mais utilizado, pois sua implementação é extremamente simples e apresenta um desempenho bastante bom. O algoritmo é baseado no princípio:
“Se a palavra A corresponder à palavra B, dados vários erros, então, com um alto grau de probabilidade, eles terão pelo menos uma substring comum de comprimento N.”
Essas substrings de comprimento N são chamadas de N-gramas.
Durante a indexação, a palavra é dividida em tais N-gramas e, em seguida, essa palavra é incluída nas listas para cada um desses N-gramas. Durante a busca, a consulta também é dividida em N-gramas e, para cada um deles, uma lista de palavras contendo tal substring é pesquisada sequencialmente.

Os mais usados ​​na prática são os trigramas - substrings de comprimento 3. A escolha de um valor maior de N leva a uma restrição no comprimento mínimo da palavra, no qual a detecção de erros já é possível.

Peculiaridades:
O algoritmo N-gram não encontra todas as palavras com erros ortográficos possíveis. Se tomarmos, por exemplo, a palavra VOTKA e a decompormos em trigramas: IN T KA → VO T CERCA DE T PARA T KA - você pode ver que todos eles contêm o erro T. Assim, a palavra "VODKA" não será encontrada, pois não contém nenhum desses trigramas, e não cairá nas listas correspondentes a eles. Assim, quanto menor o comprimento de uma palavra e mais erros ela contém, maior a chance de que ela não caia nas listas correspondentes aos N-gramas da consulta, e não esteja presente no resultado.

Enquanto isso, o método N-gram deixa espaço total para usar suas próprias métricas com propriedades e complexidade arbitrárias, mas você tem que pagar por isso - ao usá-lo, você ainda precisa enumerar sequencialmente cerca de 15% do dicionário, o que é bastante muito para grandes dicionários.

Possíveis melhorias:
É possível dividir as tabelas de hash de N-grams pelo comprimento das palavras e pela posição do N-gram na palavra (modificação 1). Como o comprimento da palavra pesquisada e a consulta não podem diferir em mais de k, e as posições de um N-grama em uma palavra podem diferir em não mais que k. Assim, será necessário verificar apenas a tabela correspondente à posição deste N-grama na palavra, bem como k tabelas à esquerda e k tabelas à direita, ou seja, Total 2k+1 mesas adjacentes.

Você pode reduzir ainda mais o tamanho do conjunto necessário para varrer dividindo as tabelas por comprimento de palavra e, da mesma forma, examinando apenas as tabelas vizinhas. 2k+1 tabelas (modificação 2).

Este algoritmo é descrito no artigo de L.M. Boytsov. Hash de assinatura. É baseado em uma representação bastante óbvia da "estrutura" de uma palavra na forma de bits, usada como um hash (assinatura) em uma tabela de hash.

Durante a indexação, esses hashes são calculados para cada uma das palavras e a correspondência da lista de palavras do dicionário com esse hash é inserida na tabela. Então, durante a busca, um hash é calculado para a consulta e todos os hashes vizinhos que diferem do original em não mais que k bits são classificados. Para cada um desses hashes, a lista de palavras correspondentes é pesquisada.

O processo de cálculo de um hash - cada bit do hash recebe um grupo de caracteres do alfabeto. Bit 1 na posição eu em um hash significa que a palavra original contém um caractere de i-ésimo grupos do alfabeto. A ordem das letras na palavra é absolutamente irrelevante.

A remoção de um caractere não alterará o valor do hash (se ainda houver caracteres do mesmo grupo alfabético na palavra), ou o bit correspondente a este grupo será alterado para 0. ser definido como 1, ou não haverá alterações. Ao substituir caracteres, tudo é um pouco mais complicado - o hash pode permanecer inalterado ou pode mudar em 1 ou 2 posições. Ao permutar, não ocorrem alterações, porque a ordem dos caracteres ao construir um hash, conforme observado anteriormente, não é levada em consideração. Assim, para cobrir completamente k erros, você precisa alterar pelo menos 2k pouco no hash.

O tempo de execução, em média, com k erros "incompletos" (inserções, exclusões e transposições, bem como uma pequena parte das substituições):

Peculiaridades:
Devido ao fato de que ao substituir um caractere, dois bits podem mudar de uma só vez, um algoritmo que implementa, por exemplo, distorção de não mais de 2 bits ao mesmo tempo não produzirá a quantidade total de resultados devido à ausência de uma parte significativa (dependendo da proporção do tamanho do hash para o alfabeto) das palavras com duas substituições (e quanto maior o tamanho do hash, mais frequentemente uma substituição de caractere levará à distorção de dois bits de uma só vez e menos completa o resultado será). Além disso, esse algoritmo não permite pesquisas de prefixo.

Árvores BK

Árvores Burkhard-Keller são árvores métricas, os algoritmos para construir tais árvores são baseados na propriedade da métrica para atender a desigualdade triangular:

Esta propriedade permite que as métricas formem espaços métricos de dimensão arbitrária. Esses espaços métricos não são necessariamente euclidiano, então, por exemplo, as métricas Levenshtein E Damerau-Levenshtein Formato não-euclidiano espaço. Com base nessas propriedades, você pode construir uma estrutura de dados que pesquise nesse espaço métrico, que são as árvores Barkhard-Keller.

Melhorias:
Você pode usar a capacidade de algumas métricas para calcular a distância com uma restrição definindo um limite superior igual à soma da distância máxima aos descendentes do vértice e a distância resultante, o que acelerará um pouco o processo:

Teste

Os testes foram realizados em um laptop com Intel Core Duo T2500 (2GHz/667MHz FSB/2MB), 2Gb de RAM, SO - Ubuntu 10.10 Desktop i686, JRE - OpenJDK 6 Update 20.

O teste foi realizado usando a distância Damerau-Levenshtein e o número de erros k = 2. O tamanho do índice é especificado junto com o dicionário (65 MB).

Tamanho do índice: 65 MB
Tempo de busca: 320ms / 330ms
Completude dos resultados: 100%

N-gramas (original)
Tamanho do índice: 170 MB
Tempo de criação do índice: 32 s
Tempo de busca: 71ms / 110ms
Completude dos resultados: 65%
N-gramas (modificação 1)
Tamanho do índice: 170 MB
Tempo de criação do índice: 32 s
Tempo de busca: 39ms / 46ms
Completude dos resultados: 63%
N-gramas (modificação 2)
Tamanho do índice: 170 MB
Tempo de criação do índice: 32 s
Tempo de busca: 37ms / 45ms
Completude dos resultados: 62%

Tamanho do índice: 85 MB
Tempo de criação do índice: 0,6 s
Tempo de busca: 55ms
Completude dos resultados: 56,5%

Árvores BK
Tamanho do índice: 150 MB
Tempo de criação do índice: 120 s
Tempo de busca: 540ms
Completude dos resultados: 63%

Total

A maioria dos algoritmos de busca difusa indexados não são verdadeiramente sublineares (ou seja, têm um tempo de execução assintótico O(log n) ou inferior), e sua velocidade de operação geralmente depende diretamente N. No entanto, inúmeras melhorias e refinamentos permitem alcançar um tempo de execução suficientemente curto, mesmo com volumes muito grandes de dicionários.

Existem também muitos métodos mais diversos e ineficientes baseados, entre outras coisas, na adaptação de várias técnicas e técnicas já usadas em outros lugares para uma determinada área de estudo. Entre esses métodos está a adaptação de árvores de prefixo (Trie) para problemas de busca difusa, que deixei de lado devido à sua baixa eficiência. Mas também existem algoritmos baseados em abordagens originais, por exemplo, o algoritmo Maass-Novak, que, embora tenha um tempo de execução assintótico sublinear, é extremamente ineficiente devido às enormes constantes ocultas por trás dessa estimativa de tempo, que se manifestam na forma de um enorme tamanho de índice.

O uso prático de algoritmos de busca difusa em mecanismos de busca reais está intimamente relacionado aos algoritmos fonéticos, algoritmos de lexicorização - destacando a parte base de diferentes formas de palavras da mesma palavra (por exemplo, tal funcionalidade é fornecida pelo Snowball e Yandex mystem), como bem como classificação com base em informações estatísticas ou usando métricas complexas e sofisticadas.

  • Distância Levenshtein (com opção de recorte e prefixo);
  • distância Damerau-Levenshtein (com opção de recorte e prefixo);
  • Algoritmo Bitap (Shift-OR / Shift-AND com modificações Wu-Manber);
  • Algoritmo de expansão de amostra;
  • método N-gram (original e com modificações);
  • Método de hashing de assinatura;
  • BK-árvores.
Eu queria tornar o código fácil de entender e, ao mesmo tempo, eficiente o suficiente para uso prático. Espremer os últimos sucos da JVM não fazia parte das minhas tarefas. aproveitar.

Vale a pena notar que, no processo de estudo deste tópico, criei alguns de meus próprios desenvolvimentos que me permitem reduzir o tempo de busca em uma ordem de magnitude devido a um aumento moderado no tamanho do índice e alguma limitação no a liberdade de escolha das métricas. Mas essa é uma história completamente diferente.


Aplicativos de exemplo de definição Criando um modelo de linguagem n-gram Calculando a probabilidade de n-gram Eliminando a dispersão de um corpus de treinamento o Suavização de adição o Desconto de Witten-Bell o Desconto de Good-Turing o Retrocesso de Katzs o Interpolação excluída Estimando um modelo de linguagem n-gram usando Conteúdo de entropia


N-gram (inglês N-gram) uma subsequência de N elementos de alguma sequência. Considere sequências de palavras. Unigramas gato, cachorro, cavalo,... Bigramas gato pequeno, cachorro grande, cavalo forte,... Trigramas gato pequeno come, cachorro grande late, cavalo forte corre,... Definição


Exemplos de tarefas aplicadas Reconhecimento de voz. Algumas palavras com grafias diferentes são pronunciadas da mesma forma. A tarefa é escolher a palavra correta no contexto. Geração de textos sobre um determinado assunto. Exemplo: Yandex.Abstracts. Procure por erros semânticos. Ele está tentando acertar - em termos de sintaxe, é verdade, em termos de semântica, não. Ele está tentando descobrir - certo. tentar descobrir é encontrado em textos em inglês com muito mais frequência do que tentar descobrir, o que significa que, se as estatísticas estiverem disponíveis, você poderá encontrar e eliminar esse tipo de erro


Criação de um modelo de linguagem de n-gramas Para resolver os problemas aplicados listados, é necessário criar um modelo de linguagem de N-gramas. Para criar um modelo, você precisa: 1. Calcular as probabilidades de n-gramas no corpus de treinamento. 2. Corrija o problema de esparsidade do casco com um dos métodos anti-aliasing. 3. Avalie a qualidade do modelo de linguagem resultante de n-gramas usando entropia.


Calculando a probabilidade de N-gramas (1) No corpus de treinamento, certos n-gramas ocorrem com frequências diferentes. Para cada n-grama, podemos contar quantas vezes ele ocorre no corpus. Com base nos dados obtidos, um modelo probabilístico pode ser construído, que pode então ser usado para estimar a probabilidade de n-gramas em algum corpus de teste.


Calculando a probabilidade de N-gramas (2) Considere um exemplo. Deixe o corpus consistir em uma frase: Eles fizeram um piquenique à beira da piscina, depois deitaram na grama e olharam para as estrelas. Vamos selecionar n-gramas. Unigramas: Eles, picknicked, por, ... Digrams: Eles fizeram piquenique, picknick by, by the, ... Trigrams Eles picknick by, picknicked pelo, by the pool, ...


Cálculo da probabilidade de N-gramas (3) Agora é possível contar n-gramas. Todos os bi e trigramas selecionados ocorrem no corpus uma vez. Todos os unigramas, com exceção da palavra the, também ocorrem uma vez. A palavra o ocorre três vezes. Agora que sabemos quantas vezes cada n-grama ocorre, podemos construir um modelo probabilístico de n-gramas. No caso de unigramas, a probabilidade da palavra u pode ser calculada pela fórmula: Por exemplo, para a palavra a probabilidade será 3/16 (porque há 16 palavras no corpus, das quais 3 são a palavra o) . Número de ocorrências da palavra u no corpus de treinamento Eles fizeram um piquenique à beira da piscina, depois deitaram na grama e olharam para as estrelas


1, a probabilidade é considerada um pouco diferente. Considere o caso dos bigramas: seja necessário calcular a probabilidade do bigrama no pool. Se considerarmos cada palavra bigrama como algum evento, então acreditando" title="(!LANG:N-gram cálculo de probabilidade (4) Para n-gramas, onde n>1, a probabilidade é calculada de forma um pouco diferente. Considere o caso de bigramas : seja necessário calcular o digrama o pool Se considerarmos cada palavra do digrama como algum evento, então acreditando" class="link_thumb"> 9 !} Calculando a probabilidade de N-gramas (4) Para n-gramas, onde n>1, a probabilidade é calculada de forma um pouco diferente. Considere o caso dos bigramas: seja necessário calcular a probabilidade do bigrama no pool. Se considerarmos cada palavra bigrama como algum evento, então a probabilidade de um conjunto de eventos pode ser calculada pela fórmula: Assim, a probabilidade do bigrama é o pool:, onde 1, a probabilidade é considerada um pouco diferente. Considere o caso dos bigramas: seja necessário calcular a probabilidade do bigrama no pool. Se considerarmos cada palavra bigrama como algum evento, então acreditando em "> 1, a probabilidade é considerada um pouco diferente. Considere o caso dos bigramas: seja necessário calcular a probabilidade do bigrama no pool. Se considerarmos cada palavra bigrama como algum evento, então a probabilidade de um conjunto de eventos pode ser calculada pela fórmula : Assim, a probabilidade do bigrama é o pool:, onde "> 1, a probabilidade é calculada um pouco diferente. Considere o caso dos bigramas: seja necessário calcular a probabilidade do bigrama no pool. Se considerarmos cada palavra bigrama como algum evento, então acreditando" title="(!LANG:N-gram cálculo de probabilidade (4) Para n-gramas, onde n>1, a probabilidade é calculada de forma um pouco diferente. Considere o caso de bigramas : seja necessário calcular o digrama o pool Se considerarmos cada palavra do digrama como algum evento, então acreditando"> title="Calculando a probabilidade de N-gramas (4) Para n-gramas, onde n>1, a probabilidade é calculada de forma um pouco diferente. Considere o caso dos bigramas: seja necessário calcular a probabilidade do bigrama no pool. Se considerarmos cada palavra do diagrama como algum evento, então acreditar"> !}


Cálculo da probabilidade de N-gramas (5) Agora considere o cálculo da probabilidade de um n-grama arbitrário (ou uma sentença de comprimento n). Expandindo o caso de bigramas, obtemos a fórmula de probabilidade para n-gramas Assim, calcular a probabilidade de uma sentença se reduz a calcular a probabilidade condicional dos N-gramas que compõem esta sentença:




Eliminação da dispersão do corpus (1) O problema de um modelo de linguagem simples (não suavizado) de n-gramas: para alguns n-gramas, a probabilidade pode ser muito subestimada (ou mesmo zero), embora na realidade (no corpus de teste) esses n-gramas podem ocorrer com bastante frequência. Motivo: corpus de treinamento limitado e sua especificidade. Solução: reduzindo a probabilidade de alguns n-gramas, aumente a probabilidade daqueles n-gramas que não ocorreram (ou foram encontrados muito raramente) no corpus de treinamento.




Eliminação de esparsidade de corpus (3) Os seguintes conceitos são usados ​​em algoritmos de eliminação de esparsidade: Tipos – palavras diferentes (sequências de palavras) no texto. Tokens são todas as palavras (sequências de palavras) no texto. Eles fizeram um piquenique à beira da piscina, depois deitaram na grama e olharam para as estrelas - 14 tipos, 16 fichas





Alisamento somado (4) O método provoca um forte erro nos cálculos (por exemplo, no slide anterior foi mostrado que para a palavra chinês o número de bigramas foi reduzido em 8 vezes). Testes mostraram que o modelo não suavizado geralmente mostra resultados mais precisos. Portanto, o método é interessante apenas do ponto de vista teórico.


Desconto de Witten-Bell (1) Baseado em uma ideia simples: use dados sobre n-gramas que ocorrem no corpus de treinamento para estimar a probabilidade de n-gramas ausentes. A ideia do método é tirada de algoritmos de compressão: dois tipos de eventos são considerados - eles encontraram um novo caractere (tipo) e encontraram um caractere (token). Fórmula de probabilidade para todos os n-gramas ausentes (ou seja, a probabilidade de encontrar um n-grama no corpus de teste que não estava no corpus de treinamento): N é o número de tokens no corpus de treinamento, T é o número de tipos que já foram encontrados no corpus de treinamento






Desconto Witten-Bell (4) =>=> =>"> =>"> =>" title="(!LANG:Desconto Witten-Bell (4) =>=>"> title="Desconto Witten-Bell (4) =>=>"> !}




Desconto de Good-Turing (1) Ideia: Para n-gramas que ocorrem zero vezes (c vezes), a pontuação é proporcional ao número de n-gramas que ocorrem uma vez (c + 1 vezes). Considere um exemplo: suponha que 18 peixes foram capturados. No total, foram capturadas 6 espécies diferentes, e apenas um representante foi capturado em três espécies. Precisamos encontrar a probabilidade de que o próximo peixe pertença a uma nova espécie. Existem 7 espécies possíveis no total (6 espécies já foram capturadas).








Katzs Backoff (2) O coeficiente α é necessário para a correta distribuição da probabilidade residual de N-gramas de acordo com a distribuição de probabilidade de (N-1)-gramas. Se você não inserir α, a estimativa será errônea, porque a igualdade não será cumprida: O cálculo de α é dado no final do relatório. Avaliação de um modelo de linguagem usando entropia (1) A entropia é uma medida de incerteza. Com a ajuda da entropia, pode-se determinar o modelo de linguagem de N-gramas mais adequado para uma determinada tarefa aplicada. Fórmula de entropia binária: Exemplo: Calcule a entropia de um teste de lançamento de moeda. Resposta: 1 bit, desde que os resultados do experimento sejam igualmente prováveis ​​(qualquer lado cai com uma probabilidade de 1/2).




Avaliação do modelo de linguagem usando entropia (3) A entropia cruzada é usada para comparar diferentes modelos de linguagem: Quanto mais próximo o valor da entropia cruzada H(p,m) da entropia real H(p), melhor o modelo de linguagem: No nosso caso, H(p ) é a entropia do corpus de teste. m(w) - modelo de linguagem (por exemplo, modelo N-gram)


Avaliação de um modelo de linguagem usando entropia (4) Existe outro método para avaliar a qualidade de um modelo de linguagem, baseado no chamado. indicador de conectividade (perplexidade). Ideia: Calcule a probabilidade de todo o corpus de teste. Um modelo melhor mostrará uma probabilidade maior. fórmula da perplexidade: Assim, quanto menor a perplexidade, melhor o modelo. A perplexidade pode ser interpretada como o número médio de palavras que podem vir após uma determinada palavra (ou seja, quanto mais perplexidade, maior a ambiguidade e, portanto, pior o modelo de linguagem). Relação entre perplexidade e entropia binária:


Estimativa de um modelo de linguagem usando entropia (5) Como exemplo, considere os valores de perplexidade para algum corpus, obtidos usando modelos treinados de unigramas, bigramas e trigramas: No caso dos trigramas, a perplexidade é a menor, pois a desambiguação é facilitada pelo maior comprimento histórico de todos os modelos (igual a 2) ao calcular as probabilidades condicionais dos trigramas. UnigramBigramTrigram Perplexity


Eu quero implementar alguns aplicativos n-gram (de preferência em PHP).

Que tipo de n-gramas é mais adequado para a maioria dos propósitos? Nível de palavra ou nível de caractere nível n-gram? Como um tokenizer n-gramatical pode ser implementado em PHP?

Primeiro, gostaria de saber o que são N-grams. Está certo? É assim que eu entendo n-grams:

Sugestão: "Eu moro em Nova York."

birams de nível de palavra (2 para n): "# I", "I live", "live in", "in New York", "NY #"

birams de nível de caractere (2 para n): "#I", "I #", "#l", "li", "iv", "ve", "e #", "#i", "in", "n#", "#N", "NY", "Y#"

Depois de ter essa matriz de partes n-gram, você joga duplicatas e adiciona um contador para cada parte que especifica a frequência:

bigramas de nível de palavra:

Bigramas de nível de personagem:

Está correto?

Além disso, gostaria de saber mais sobre o que você pode fazer com n-grams:

  • Como posso detectar o idioma de um texto usando n-grams?
  • É possível fazer tradução automática usando n-grams mesmo se você não tiver um corpus bilíngue?
  • Como criar um filtro de spam (spam, ham)? Combinar n-gramas com filtro Bayesiano?
  • Como posso encontrar um tópico? Por exemplo: há um texto sobre basquete ou cachorros? Minha abordagem (faça o seguinte com o artigo da Wikipedia para "cachorros" e "basquete"): plote os vetores n-gram para ambos os documentos, normalize-os, calcule a distância Manhattan/Euclid, quanto mais próximo o resultado estiver de 1, maior a semelhança será

Como você se sente sobre a minha candidatura, especialmente a última?

Espero que possa me ajudar. Desde já, obrigado!

2 respostas

O Word n-gram geralmente será mais útil para a maioria dos aplicativos de análise de texto que você mencionou, com a possível exceção da definição de linguagem, onde algo como trigramas de caracteres pode fornecer melhores resultados. Efetivamente, você criaria um vetor de n-gramas para o corpo do texto em cada idioma de seu interesse e, em seguida, compararia as frequências de trigramas em cada corpus com as do documento que você está classificando. Por exemplo, é provável que o trigrama the apareça com muito mais frequência em inglês do que em alemão e forneceria algum nível de correlação estatística. Uma vez que você tenha documentos n-gram, você tem uma escolha de muitos algoritmos para análise posterior, Filtros Baysianos, N Vizinhos Mais Próximos, Máquinas de Vetor de Suporte, etc.

Das aplicações que você mencionou, a tradução automática é provavelmente a mais absurda, já que n-gramas por si só não o levarão muito longe. Converter um arquivo de entrada para representação n-gram é apenas uma maneira de colocar os dados em um formato para análise de recursos adicionais, mas como você perde muitas informações contextuais, pode não ser útil para tradução.

Uma coisa a notar é que não é suficiente criar um vetor para um documento e um vetor para outro documento se as dimensões não corresponderem. Ou seja, a primeira entrada no vetor não pode estar em um documento e está em outro, ou os algoritmos não funcionarão. Você terminará com vetores como , já que a maioria dos documentos não conterá mais do que os n-gramas nos quais você está interessado. Esse "revestimento" também exige que você determine com antecedência quais nggramas você incluirá em sua análise. Muitas vezes, isso é implementado como um algoritmo de duas passagens para primeiro decidir a significância estatística dos vários n-gramas para decidir o que manter. Google "seleção de recursos" para mais informações.

N-grams baseados em palavras mais suporte para máquinas vetoriais é uma ótima maneira de definir um tópico, mas para preparar um classificador você precisa de um grande corpus de texto pré-classificado em tópicos "on-topic" e "off-topic". Você encontrará um grande número de trabalhos de pesquisa explicando várias abordagens para esse problema em um site como o citeseerx. Eu não recomendaria a abordagem da distância euclidiana para esse problema, pois ela não pondera n-gramas individuais com base na significância estatística, portanto, dois documentos que incluem , a , is e of seriam considerados uma correspondência melhor do que dois documentos , que incluía Baysian. Remover as palavras de parada de seus n-gramas de interesse melhoraria um pouco isso.

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

Você pode usar n-grams de nível de palavra para aplicativos de tipo de pesquisa. N-grams de nível de caractere podem ser usados ​​mais para analisar o próprio texto. Por exemplo, para identificar o idioma de um texto, eu usaria as frequências de letras contra as frequências de linguagem estabelecidas. Ou seja, o texto deve corresponder aproximadamente à frequência de ocorrência das letras nesse idioma.

O tokenizer n-gramatical para palavras em PHP pode ser feito usando strtok:

Para caracteres, use split:

Você pode então simplesmente dividir a matriz como quiser em qualquer número de n-gramas.

Os filtros bayesianos precisam ser treinados para uso como filtros de spam que podem ser usados ​​em conjunto com n-grams. No entanto, você precisa dar a ele muitas informações para mantê-lo aprendendo.

Sua última abordagem parece decente, pois aprende o contexto da página ... ainda é bastante complicado de fazer, mas os n-grams parecem um bom ponto de partida para isso.