2012-04-16 18 views
5

Actualmente estoy desarrollando una aplicación web para buscar la transmisión de Twitter y tratando de crear un procesamiento de lenguaje natural por mi cuenta.División de cadena que contiene letras y números no separados por ningún delimitador particular en PHP

Dado que mis datos son de Twitter (limitado por 140 caracteres) hay muchas palabras abreviadas, o en este caso, espacio omitido.

Por ejemplo:

"Hi, my name is Bob. I m 19yo and 170cm tall" 

caso de que se tokens a:

- hi 
- my 
- name 
- bob 
- i 
- 19 
- yo 
- 170 
- cm 
- tall 

en cuenta que 19 y yo en 19yo tienen hay espacio entre ellos. Lo uso principalmente para extraer números con sus unidades.

Simplemente, lo que necesito es una forma de 'explotar' cada token que tiene un número en él por un trozo de números o letras sin delimitador.

'123abc' habrá ['123', 'abc']

'abc123' habrá ['abc', '123']

'abc123xyz' habrá ['abc', '123', 'xyz']

y así sucesivamente.

¿Cuál es la mejor manera de lograrlo en PHP?


Encontré algo parecido, pero es C# y específicamente para dividir día/mes. How do I split a string in C# based on letters and numbers

+1

# simplemente curioso, ¿por qué necesita una extracción como esa? – hjpotter92

+1

Pude ver hacer esto para la creación dinámica de babosas, pero también podría hacerse con solo delimitación de espacio/puntuación. – Dutchie432

+0

@ persiguiendo a la muerte porque la fuente de datos (corriente de Twitter) tiene escritura inconsistente – akhyar

Respuesta

7

Puede utilizar preg_split

$string = "Hi, my name is Bob. I m 19yo and 170cm tall"; 
$parts = preg_split("/(,?\s+)|((?<=[a-z])(?=\d))|((?<=\d)(?=[a-z]))/i", $string); 
var_dump ($parts); 

Cuando juego contra el límite letras dígitos, la coincidencia de expresiones regulares deben ser de anchura cero. Los personajes en sí no deben incluirse en el partido. Para esto, el zero-width lookarounds es útil.

http://codepad.org/i4Y6r6VS

+0

Sí, parece que no funciona bien. (http://codepad.org/4lWwbs4g) – Dutchie432

+0

Ni siquiera en la entrada suministrada (http://codepad.org/NsTWhhDX) – jprofitt

+0

Lo sentimos, no lo hemos probado de manera obvia. No sabía que existiera codepad.org. Lo usaré ahora. –

1

¿qué tal esto:

extraer los números de secuencia mediante el uso de expresiones regulares, almacenarlos en una matriz, sustituir los números en cadena con algún tipo de carácter especial, que será 'mantener' su posición . y después de analizar la cadena creada solo por sus caracteres especiales y caracteres normales, alimentará sus números de la matriz a sus lugares reservados.

solo una idea, pero podría serle útil.

EDIT: intente ejecutar este código breve, con suerte verá mi punto en la salida. (este código no funciona en el teclado, no sé por qué)

<?php 
$str = "Hi, my name is Bob. I m 19yo and 170cm tall"; 
preg_match_all("#\d+#", $str, $matches); 
$str = preg_replace("!\d+!", "#SPEC#", $str); 

print_r($matches[0]); 
print $str; 
+0

interesante, pero también un poco confuso para mí ... ¿podría darme alguna explicación adicional? – akhyar

+0

respuesta editada, compruébalo. si necesita más explicaciones, solo pregunte, apoyaré toda la solución una vez que me haya dormido;) – xholicka

Cuestiones relacionadas