Extrair sequência canônica de uma lista de sequências ruidosas

10

Eu tenho milhares de listas de strings, e cada lista tem cerca de 10 strings. A maioria das seqüências de caracteres em uma determinada lista é muito semelhante, embora algumas sejam (raramente) completamente não relacionadas às outras e algumas contenham palavras irrelevantes. Eles podem ser considerados variações ruidosas de uma corda canônica. Eu estou procurando um algoritmo ou uma biblioteca que irá converter cada lista nessa seqüência de caracteres canônica.

Aqui está uma dessas listas.

  • Star Wars: Episódio IV Uma Nova Esperança | StarWars.com
  • Star Wars Episódio IV - Uma Nova Esperança (1977)
  • Star Wars: Episódio IV - Uma Nova Esperança - Rotten Tomatoes
  • Assista Star Wars: Episódio IV - Uma Nova Esperança Online Grátis
  • Guerra nas Estrelas (1977) - Maiores Filmes
  • [REC] 4 cartazes prometem morte por motor externo - SciFiNow

Para esta lista, qualquer sequência que corresponda à expressão regular ^Star Wars:? Episode IV (- )?A New Hope$seria aceitável.

Analisei o curso de Andrew Ng sobre Machine Learning no Coursera, mas não consegui encontrar um problema semelhante.

lacton
fonte
2
PS Eu acho que o termo que você está procurando "canônica"
Sean Owen
A string "mais provável" / "mais consensual" que você deseja identificar é uma expressão regular? Ou uma das strings da lista?
precisa saber é o seguinte
@MrMeritology Não estou procurando uma expressão regular. Eu mostrei uma expressão regular na minha pergunta apenas para ilustrar o quão flexível eu sou no tipo de strings que consideraria corretas.
lactona
ESTÁ BEM. Então a resposta que dei abaixo deve funcionar para você.
precisa saber é o seguinte
Isso seria incluído no NER (reconhecimento de entidade nomeada)?
Hippietrail 26/09/14

Respostas:

4

Como uma solução ingênua, sugiro primeiro selecionar as seqüências que contêm os tokens mais frequentes dentro da lista. Dessa forma, você pode se livrar de seqüências irrelevantes.

Na segunda frase, eu faria uma votação majoritária. Assumindo as 3 frases:

  • Star Wars: Episódio IV Uma Nova Esperança | StarWars.com
  • Star Wars Episódio IV - Uma Nova Esperança (1977)
  • Star Wars: Episódio IV - Uma Nova Esperança - Rotten Tomatoes

Eu examinaria os tokens um por um. Começamos por "Star". Ele vence quando todas as cordas começam com ele. "Wars" também vencerá. O próximo é ":". Também vai ganhar.

Todos os tokens serão votados majoritariamente até "Hope". O próximo token depois de "Hope" será "|" ou "(" ou "-". Nada ganhará na votação majoritária, portanto, vou parar por aqui!

Outra solução seria provavelmente usar a subsequência comum mais longa .

Como eu disse, não pensei muito sobre isso. Portanto, pode haver muito mais soluções melhores para o seu problema :-)

Pasmod Turing
fonte
3

Primeiro calcule a distância de edição entre todos os pares de cadeias. Veja http://en.wikipedia.org/wiki/Edit_distance e http://web.stanford.edu/class/cs124/lec/med.pdf . Em seguida, exclua quaisquer strings de outliers com base em algum limite de distância.

Com as strings restantes, você pode usar a matriz de distância para identificar a string mais central. Dependendo do método usado, você poderá obter resultados ambíguos para alguns dados. Nenhum método é perfeito para todas as possibilidades. Para seus propósitos, tudo o que você precisa é de algumas regras heurísticas para resolver ambiguidades - ou seja, escolha dois ou mais candidatos.

Talvez você não queira escolher o "mais central" da sua lista de cadeias, mas sim gerar uma expressão regular que capture o padrão comum a todas as cadeias não externas. Uma maneira de fazer isso é sintetizar uma string que é equidistante de todas as strings não externas. Você pode calcular a distância de edição necessária da matriz e gerar aleatoriamente regularmente usando essas distâncias como restrições. Em seguida, você testaria expressões regulares candidatas e aceitaria a primeira que se encaixasse nas restrições, além de aceitar todas as seqüências de caracteres na sua lista não discrepante. (Comece a criar expressões regulares a partir de listas de substring comuns mais longas, porque esses são caracteres não curinga.)

MrMeritology
fonte