¡Tengo un documento de texto que tiene una carga de texto que tiene un espacio adicional agregado después de cada letra!
Ejemplo:
T h e b o o k a l s o h a s a n a n a l y t i c a l p u r p o s e w h i c h i s m o r e i m p o r t a n t…
Visualmente:
T␣h␣e␣␣b␣o␣o␣k␣␣a␣l␣s␣o␣␣h␣a␣s␣␣a␣n␣␣a␣n␣a␣l␣y␣t␣i ␣c␣a␣l␣␣p␣u␣r␣p␣o␣s␣e␣␣w␣h␣i␣c␣h␣␣i␣s␣␣m␣o␣r␣e␣␣i␣ m␣p␣o␣r␣t␣a␣n␣t ...
Tenga en cuenta que hay un espacio adicional después de cada letra, por lo que hay dos espacios entre palabras consecutivas.
¿Hay alguna forma de obtener awk
o sed
eliminar los espacios adicionales? (Desafortunadamente, este documento de texto es masivo y tomaría mucho tiempo para pasarlo manualmente).
Aprecio que este es probablemente un problema mucho más complejo de resolver con solo un simple script bash, ya que también debe haber algún tipo de reconocimiento de texto.
¿Cómo puedo abordar este problema?
text-processing
sed
awk
scripting
lloowen
fuente
fuente
echo 't h i s i s a n e x a m p l e' | sed 's/ //g'
echo 'T h i s ; i s .a n 9 8 e x a m p l e' | perl -pe 's/[a-z]\K (?=[a-z])//ig'
Respuestas:
La siguiente expresión regular eliminará el primer espacio en cualquier cadena de espacios. Eso debería hacer el trabajo.
Entonces algo como:
... reemplazará infile.txt con una versión "fija".
fuente
perl -pie
muestra en su edición. ¿Cuál es la razón de esto? La pieza siempre ha funcionado bien para mí, y es una gran mnemotécnica. ¿Ha cambiado el comportamiento de -i para tratar todo lo que sigue como una extensión, en lugar de solo aquellas cosas que comienzan con un punto? Les parecería extraño romper algo tan idiomático.-i
. Por otro lado, solo lo he usado en máquinas Linux y no lo he sabido por más de unos años, por lo que no puedo hablar de su comportamiento anterior. En mi máquina, sin embargo, esto:perl -pie 's/a/b/' f
, produce un error:Can't open perl script "s/o/A/": No such file or directory
. Mientrasperl -i -pe 's/o/A/' f
funciona como se esperaba. Entonces sí,e
se toma como la extensión de respaldo.Use
wordsegment
un paquete NLP de segmentación de palabras de Python puro:fuente
Basado en el hecho de que la entrada incluye espacios dobles entre palabras, hay una solución mucho más simple. Simplemente cambie los espacios dobles a un carácter no utilizado, elimine los espacios y vuelva a cambiar el carácter no utilizado a un espacio:
... salidas:
fuente
sed -e "s/\([^ ]\) /\1/g"
¡Perl al rescate!
Necesita un diccionario, es decir, un archivo con una palabra por línea. En mi sistema, existe como
/var/lib/dict/words
, también he visto archivos similares como/usr/share/dict/british
etc.Primero, recuerdas todas las palabras del diccionario. Luego, lee la entrada línea por línea e intenta agregar caracteres a una palabra. Si es posible, recuerda la palabra e intenta analizar el resto de la línea. Si llega al final de la línea, genera la línea.
Para su entrada, genera 4092 lecturas posibles en mi sistema.
fuente
a cat a log
iea c a t a l o g
Nota: esta respuesta (como algunas otras aquí) se basa en una versión anterior de la pregunta donde las palabras no estaban delimitadas. La versión más nueva se puede responder trivialmente .
En una entrada como:
Tu podrías intentar:
Procesa de izquierda a derecha y encuentra una palabra más larga después de la siguiente.
Obviamente, aquí, no es la mejor selección de palabras, ya que esa oración no tiene ningún sentido, pero para encontrar la correcta, necesitaría herramientas capaces de comprender la gramática o el significado del texto o al menos algunas estadísticas información sobre qué palabras es probable que se encuentren juntas para llegar al conjunto de palabras más probable. Parece que la solución es una biblioteca especializada encontrada por Lynn
fuente
Similar a la versión de Dewi Morgan, pero con sed:
fuente
sed
solo GNU y no es equivalente a Dewi. Elsed
equivalente estándar de Dewi seríased 's/ \( *\)/\1/g'
Aunque podría (y debería) hacerse con una línea Perl, un analizador de C pequeño también sería muy rápido, y también es muy pequeño (y con suerte muy correcto):
Compilado con
(el programa es un poco menos de 9kb)
Usar en una tubería como por ejemplo:
fuente
Intenté esto y parece funcionar:
El
sed
comando captura dos grupos y devuelve solo el primero.fuente
En c ++, haría esto:
Cambiará el contenido del archivo de texto de prueba, en la misma cadena, pero con espacios entre letras eliminados. (Se requiere un espacio entre cada letra para ser exacto).
fuente
fuente