Quantas strings estão próximas a um determinado conjunto de strings?


7

Essa pergunta foi solicitada por estruturas de dados eficientes para criar um verificador ortográfico rápido .

Dadas duas cordas u,v, dizemos que eles estão perto de se sua distância Damerau – Levenshtein ¹ for pequena, ou seja, para um fixo . Informalmente, é o número mínimo de operações de exclusão, inserção, substituição e troca (vizinho) necessárias para transformar em . Pode ser calculado em por programação dinâmica. Observe que é uma métrica , especialmente simétrica.kLD(u,v)kkNLD(u,v)uvΘ(|u||v|)LD

A questão do interesse é:

Dado um conjunto de cadeias acima de com comprimentos no máximo , qual é a cardinalidade deSnΣm

Sk:={wΣvS. LD(v,w)k} ?

Como até duas cordas do mesmo comprimento têm números diferentes de cordas close², pode ser difícil (impossível?) Encontrar uma fórmula / abordagem geral. Portanto, podemos ter que calcular o número explicitamente para cada fornecido , levando-nos à pergunta principal:kS

Qual é a complexidade (de tempo) de encontrar a cardinalidade do conjunto para (arbitrário) ?{w}kwΣ

Observe que a quantidade desejada é exponencial em, portanto, a enumeração explícita não é desejável. Um algoritmo eficiente seria ótimo.|w|

Se ajudar, pode-se supor que temos realmente um conjunto (grande) de , ou seja, resolvemos a primeira questão destacada.S


  1. As variantes possíveis incluem o uso da distância de Levenshtein .
  2. Considere e . Os conjuntos de cadeias close sobre são (8 palavras) e (10 palavras), respectivamente.aaab1{a,b}{a,aa,ab,ba,aaa,baa,aba,aab}{a,b,aa,bb,ab,ba,aab,bab,abb,aba}

A questão destacada não é basicamente uma pesquisa de vizinhos k-mais próximos? Mais especificamente, estou pensando em índices espaciais. Existem estruturas de dados que suportam consultas k-NN eficientes com métricas arbitrárias (com algumas restrições), como a M-tree e suas variantes. Estou faltando alguma coisa ou você acha que isso funcionaria?
Juho

@mrm Claro, isso funcionaria - se eu escrever todas as palavras exponencialmente até um certo comprimento (o que eu não quero fazer), calcule todos os alinhamentos aos pares (que eu quero contornar) e depois construa a árvore .
Raphael

11
@mrm: Agora que penso nisso, encontrar o kvizinhos mais próximos não resolve o problema. Queremos encontrar todos os vizinhos (até uma distância fixa).
Raphael

Certo, é uma pesquisa de consulta por intervalo . Acho que há muita pesquisa sobre o assunto, com enormes quantidades de dados e grandes bancos de dados. Mas, independentemente disso, entendo o seu ponto agora. Talvez haja uma maneira mais inteligente :)
Juho

Algumas observações bastante fáceis: (1) se apenas exclusões são permitidas, o (segundo) problema é polinomial; (2) um limite para a contagem éO((|w|+k)k).
Rgrig 10/05/12

Respostas:


1

Veja o artigo de Levenshtein . Ele contém limites nas seqüências numéricas obtidas da inserção e exclusão de uma sequência. E sen é o comprimento da string e a string é binária, então o número máximo de vizinhos mais próximos na distância de Levenshtein é Θ(n2). É relativamente mais difícil dizer algo sobrekvizinhos mais próximos, mas pode-se obter limites. Eles devem fornecer uma estimativa da complexidade.


Obrigado, mas essa não é a métrica correta, nem um alfabeto binário será suficiente (embora o tamanho do alfabeto provavelmente não tenha impacto qualitativo). Como não falo russo, não posso verificar com que facilidade os resultados podem ser transferidos.
Raphael

Os limites parecem fáceis de encontrar, mas a pergunta pede uma contagem exata. Estou errado @Raphael?
Rrig # 10/12

Há uma versão em inglês do artigo de Levenshtein que você deve encontrar; Ele também contém limites para o alfabeto geral.
Ankur #

@rgrig: A pergunta pede o número exato, mas os limites (bons) seriam apreciados.
Raphael

0

Se seu k é fixo e você tem permissão para fazer o pré-processamento, isso é algo que você pode tentar

  1. Construa um gráfico de modo que os nós sejam palavras e exista uma aresta entre dois nós se a distância entre essas duas palavras for 1.
  2. Obtenha a matriz de adjacência correspondente ao gráfico (digamos M)
  3. Calcular Mk

Agora, você poderá usar a matriz final para responder a todas as perguntas. Se você pode armazenarM,M2,M4,M8 etc. Você pode responder por uma variedade maior de k em vez de fixo k, é claro que se pagará aqui com o custo da multiplicação da matriz.


Este é um procedimento bastante ingênuo, não é? Computando todas as distâncias aos pares e realizando a pesquisa pela primeira vez em profundidadekjá é mais eficiente.
Raphael

Suponho que você queira dizer a pesquisa pela primeira vez no gráfico construído acima. Nesse caso, você fará a pesquisa para todas as consultas que fizer. Isso não seria melhor que a enumeração (que você especificou na sua pergunta que não queria fazer). Na minha resposta acima, eu computoMkcomo uma etapa de pré-processamento, que deve ser realizada apenas uma vez. Depois disso, para cada consulta, basta passar por uma linha / coluna dessa matriz, proporcionando assim um tempo de resposta mais rápido.
TenaliRaman

11
Bem, os dois modos podem esconder seu esforço "real" como pré-processamento. Observe queM é exponencialmente grande em tamanho máximo n, portanto, "passar por uma linha / coluna" não é eficiente. Computar as distâncias em si não é o gargalo aqui. (Você precisariai=1kMi, a propósito.)
Raphael

Na realidade Mé apenas num_words x num_words. Além disso, é booleano e possivelmente muito escasso. Você vê o porquê?
TenaliRaman

Sim e não. Skcontém todas as palavras próximas e existem exponencialmente muitas palavras, ou seja,num_words =2m. Eu editei a pergunta para esclarecer.
Raphael
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.