2009-07-26 15 views
7

? He estado tratando de encontrar una forma de detectar series de archivos. Por ejemplo:¿Cómo puedo detectar grupos de cadenas comunes en nombres de archivos

Si un directorio dado tiene los siguientes archivos:

  • Birthday001.jpg
  • Birthday002.jpg
  • Birthday003.jpg
  • Picknic1.jpg
  • Picknic2.jpg
  • Afternoon.jpg.

me gustaría obtener la condensar el anuncio a algo así como

  • cumpleaños (3 fotos)
  • Picknic (2 fotos)
  • Tarde (1 foto)

¿Cómo debo proceder para detectar los grupos?

+0

Creo que esta es una gran pregunta a menos que el único algoritmo sea la fuerza bruta en la naturaleza. –

Respuesta

6

Aquí hay una manera de resolver esto, que es más eficiente que un método de fuerza bruta.

  • carga todos los nombres en una matriz asociativa con clave igual al nombre y el valor igual al nombre pero con dígitos despojado (preg_replace('/\d//g', $key)).

Tendrá algo así como $arr1 = [Birthday001 => Birthday, Birthday002 => Birthday ...]

  • ahora hacer otra matriz asociativa con las claves que son los valores de la primera matriz y un valor que es un recuento. Incrementa el conteo cuando ya has visto la clave.
  • Al final terminarás con una segunda matriz que contiene los nombres y los recuentos, justo como querías. Algo así como $arr2 = [Birthday => 2, ...]
+1

Esto funcionaría si supone que todos los tokens semánticos son iguales una vez que se eliminan los dígitos. Esto no abordaría elementos como "Mi cumpleaños001.jpg" y "MyBirthday002.jpg", pero es un buen punto de partida. – Kitson

+0

Estoy totalmente de acuerdo. Sin embargo, la pregunta no se planteó de esa manera y quien lo editó para incluir Mi cumpleaños y agruparlo con Birthday001, Birthday002 ha cambiado la pregunta considerablemente. El OP puede realmente querer agrupar eso en 2 grupos diferentes. –

+0

Sí, esto es más o menos exactamente lo que estoy buscando. Mi principal preocupación era hacer coincidir la cadena de prefijos. Este es un gran punto de partida. Gracias. – Ambirex

2

simplemente construir un histograma cuyas claves se modifican mediante una expresión regular:

<?php 

# input 
$filenames = array("Birthday001.jpg", "Birthday002.jpg", "Birthday003.jpg", "Picknic1.jpg", "Picknic2.jpg", "Afternoon.jpg"); 

# create histogram 
$histogram = array(); 
foreach ($filenames as $filename) { 
    $name = preg_replace('/\d+\.[^.]*$/', '', $filename); 
    if (isset($histogram[$name])) { 
     $histogram[$name]++; 
    } else { 
     $histogram[$name] = 1; 
    } 
} 

# output 
foreach ($histogram as $name => $count) { 
    if ($count == 1) { 
     echo "$name ($count picture)\n"; 
    } else { 
     echo "$name ($count pictures)\n"; 
    } 
} 

?> 
+0

Esto es casi exactamente igual a mi versión, excepto en el código. –

0

Generar una matriz de palabras como "mi" (el desarrollo de esta gama será muy importante, "mi" es el único en su ejemplo dado) y quítelos de todos los nombres de archivo. Elimine todos los números y la puntuación, también las extensiones deberían haber desaparecido en este punto. Una vez hecho esto, coloque todos los resultados únicos en una matriz. A continuación, puede utilizar esto como una fuente bastante confiable de palabras clave para buscar cualquier rezagado que el otro procesamiento no captó.

+0

Nota: esta respuesta se basa en una versión revisada de la pregunta que se ha retrotraído desde entonces. Esa versión incluía un archivo llamado "Mi cumpleaños.jpg" que se suponía que estaba agrupado con los otros archivos de "Cumpleaños". –

Cuestiones relacionadas