Tengo este archivo de texto:
714
01:11:22,267 --> 01:11:27,731
Auch wenn noch viele Generationen auf einen Wechsel hoffen,
Even if it takes many generations hoping for a change,
715
01:11:27,732 --> 01:11:31,920
werde ich mein Bestes geben
und hoffe, dass andere das gleiche tun.
I'm giving mine, I'm doing my best
hoping the other will do the same
716
01:11:31,921 --> 01:11:36,278
Wir haben eine harte Arbeit vor uns,
um den Lauf der Dinge zu ändern.
it's going to be hard work
for things to turn around.
717
01:11:36,879 --> 01:11:42,881
Wenn man die Zentren künstlicher Besamung,
die Zuchtlaboratorien und die modernen Kuhställe besichtigt,
When visiting artificial insemination centers,
the selection center, modern stables,
...
y me gustaría analizarlo para que solo queden las líneas que no están en inglés
¿es posible?
Respuestas:
Hay un camino difícil y mucho más fácil. La forma difícil es utilizar el análisis de lenguaje natural para dar una probabilidad de que una línea determinada esté en inglés y descartar dichas líneas.
La forma más fácil es tomar una lista de palabras de detención en inglés y eliminar líneas que contienen elementos de esa lista. Si desea disminuir la posibilidad de categorizar erróneamente una línea, también puede buscar la presencia de palabras de detención alemanas en las líneas que no puede rechazar para verificar que probablemente sean alemanas.
Aquí hay un script muy rápido y sucio para usar la lista de palabras de parada vinculadas para hacer el filtrado:
y la salida:
Una versión un poco más completa debería ignorar varios signos de puntuación,
,.
pero no el apóstrofe'
en inglés, dentro de una palabra. Se podría obtener una precisión aún mayor buscando puntos de código que nunca ocurran en inglés (por ejemplo«ßü
) pero que se dejan como ejercicio para el lector.fuente
En su muestra, esto funcionaría:
Detalles
RS=
. Establece el separador de registros . Un valor vacío es un caso especial que significa que un registro es un párrafo (secuencia de líneas delimitadas por líneas vacías).-F '\n'
: establece el separador de campo (los campos en cada registro son líneas).OFS='\n'
: establece el separador de campo de salida.Para cada registro (párrafo):
NF=1+NF/2
(oNF=2
(las primeras 2 líneas)+ (NF-2)/2
(la mitad de las líneas restantes)): cambie el número de campos para excluir los ingleses.printf "%s", $0 RT
: imprime el registro seguido del terminador del registro (para restaurar la misma cantidad de espacio entre párrafos). Para ver qué está haciendo el código anterior, es útil si agrega algunas declaraciones de impresión en la mezcla. Algo como esto:Eso supone finales de línea Unix. Si el archivo está en formato MSDOS como es común con los archivos de subtítulos, debe preprocesarlo con
d2u
odos2unix
.fuente
NF-=NF/2-1
bit. ¿Está calculando por ejemploNF=4
para el primer registro, 714. Para que pueda obtener los valoresNF=4
yNF/2-1=1
, a continuación, restando la1
de laNF
dejándole con3
? Luego imprime los primeros3
"campos" del registro y, por lo tanto, suelta la cuarta línea.La pieza clave para este tipo de enfoque es tener acceso a una buena base de datos de palabras en inglés. Existe este archivo en mi sistema,
/usr/share/dict/words
que tiene muchas palabras, pero en su lugar podrían usarse otras fuentes.Acercarse
Mi enfoque general sería usarlo
grep
así:Donde está su salida de ejemplo
sample.txt
.En mis pruebas limitadas, el tamaño del
words
diccionario parecía empantanarsegrep
. Mi versión tiene más de 400k líneas. Entonces comencé a hacer algo como esto para dividirlo un poco:Ejecuciones de muestra (10k)
Luego, ejecute su archivo usando las primeras 10k palabras del "diccionario".
NOTA: Este enfoque se ejecutó en ~ 1.5 segundos, en mi computadora portátil i5.
Parece ser un enfoque viable. Sin embargo, cuando lo incrementé hasta las 100 mil líneas, comenzó a tomar mucho tiempo, lo aborté antes de que terminara, para que pudiera dividir el
words
diccionario en varios archivos.NOTA: Cuando retrocedí a 50k líneas, tardé 32 segundos.
Bucear más profundo (50k líneas)
Cuando comencé a expandir el diccionario hasta 50k, me encontré con el problema que temía, la superposición entre los idiomas.
Analizando el problema
Una buena cosa con este enfoque es que puede eliminar
-v
y ver dónde está la superposición:auf
Aparentemente, la palabra está en ambos idiomas ... bueno, al menos está en miwords
archivo, por lo que este podría ser un enfoque de prueba y error para refinar la lista de palabras según sea necesario.NOTA: Sabía que era la palabra
auf
porque lagrep
coloreaba de rojo, eso no aparece en la salida anterior debido a la naturaleza limitada de SE 8-).fuente
grep -wf ...
hace. Con un mejor suministro de palabras, este enfoque sería más directo. La otra solución (la de Stephane) depende de los datos que se están estructurando y no los mira de manera contextual, aunque el enfoque de msw parece tener mejores piernas para mí.Esto parece un
.srt
archivo. Si es así, y si el número de líneas en inglés por subtítulo es siempre el mismo que el número de líneas en alemán, puede usar:Dónde
old.srt
y dóndenew.srt
están sus archivos de entrada y salida elegidos.fuente