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)≥kk∈NLD⁡(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∈Σ∗∣∃v∈S. 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ê precisaria∑i=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.