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.
nlp
similarity
information-retrieval
lacton
fonte
fonte
Respostas:
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:
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 :-)
fonte
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.)
fonte