J'ai ce fichier texte:
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,
...
et je voudrais l'analyser de sorte que seules les lignes non anglais restent
Est-ce possible?
Réponses:
Il y a une voie difficile et une voie beaucoup plus facile. La méthode la plus difficile consiste à utiliser l'analyse en langage naturel pour donner une probabilité qu'une ligne donnée soit en anglais et supprimer ces lignes.
Le moyen le plus simple consiste à prendre une liste de mots vides en anglais et à supprimer les lignes contenant des éléments de cette liste. Si vous souhaitez réduire les risques de catégorisation erronée d'une ligne, vous pouvez également rechercher la présence de mots vides allemands dans les lignes que vous ne parvenez pas à rejeter pour vérifier qu'ils sont probablement allemands.
Voici un script très rapide et sale pour utiliser la liste de mots vides liés pour effectuer le filtrage:
et la sortie:
Une version légèrement plus complète devrait ignorer diverses ponctuations comme
,.
mais pas l'apostrophe anglaise'
dans un mot. Une précision encore plus grande pourrait être obtenue en recherchant des points de code qui ne se produisent jamais en anglais (par exemple«ßü
), mais cela reste un exercice pour le lecteur.la source
Sur votre échantillon, cela fonctionnerait:
Détails
RS=
. Définit le séparateur d'enregistrement . Une valeur vide est un cas particulier qui signifie qu'un enregistrement est un paragraphe (séquence de lignes délimitées par des lignes vides).-F '\n'
: définit le séparateur de champs (les champs de chaque enregistrement sont des lignes).OFS='\n'
: définit le séparateur de champ de sortie.Pour chaque enregistrement (paragraphe):
NF=1+NF/2
(ouNF=2
(les 2 premières lignes)+ (NF-2)/2
(la moitié des lignes restantes)): modifiez le nombre de champs pour exclure les champs anglais.printf "%s", $0 RT
: imprime l' enregistrement suivi de la terminaison d'enregistrement (pour restaurer la même quantité d'espacement entre les paragraphes). Pour voir ce que fait le code ci-dessus, il est utile si vous ajoutez des instructions d'impression dans le mélange. Quelque chose comme ça:Cela suppose des fins de ligne Unix. Si le fichier est au format MSDOS comme cela est courant avec les fichiers de sous-titres, vous devez le prétraiter avec
d2u
oudos2unix
.la source
NF-=NF/2-1
bit. Êtes-vous en train de calculer, disons,NF=4
pour le premier enregistrement, 714. Donc, vous obtenez les valeursNF=4
etNF/2-1=1
, puis soustrayez le1
deNF
vous laissant avec3
? Ensuite, l'impression des premiers3
"champs" de l'enregistrement, d'où la suppression de la 4ème ligne?L'élément clé de ce type d'approche est d'avoir accès à une bonne base de données de mots anglais. Il y a ce fichier sur mon système,
/usr/share/dict/words
qui contient beaucoup de mots, mais d'autres sources pourraient être utilisées à la place.Approche
Mon approche générale serait d'utiliser
grep
comme ceci:Où se trouve votre exemple de sortie
sample.txt
.Dans mes tests limités, la taille du
words
dictionnaire semblaitgrep
s'enliser. Ma version contient 400k + lignes. J'ai donc commencé à faire quelque chose comme ça pour le casser un peu:Exemples de courses (10k)
Exécutez votre fichier en utilisant les premiers 10k mots du "dictionnaire".
REMARQUE: cette approche a fonctionné en environ 1,5 seconde sur mon ordinateur portable i5.
Cela semble être une approche viable. Quand je l'ai fait passer à 100 000 lignes, cela a commencé à prendre du temps, je l'ai avorté avant qu'il ne soit terminé, afin que vous puissiez diviser le
words
dictionnaire en plusieurs fichiers.REMARQUE: lorsque je l'ai reculé sur 50 000 lignes, cela a pris 32 secondes.
Plonger plus profondément (50k lignes)
Quand j'ai commencé à étendre le dictionnaire jusqu'à 50k, je suis tombé sur le problème dont j'avais peur, le chevauchement entre les langues.
Analyser le problème
Une bonne chose avec cette approche est que vous pouvez supprimer le
-v
et voir où se trouve le chevauchement:Le mot
auf
est apparemment dans les deux langues ... enfin au moins, il est dans monwords
dossier, donc cela pourrait être un peu une approche par essais et erreurs pour affiner la liste de mots selon les besoins.REMARQUE: je savais que c'était le mot
auf
parce qu'il étaitgrep
coloré en rouge, cela n'apparaît pas dans la sortie ci-dessus en raison de la nature limitée de SE 8-).la source
grep -wf ...
ça fait. Avec une meilleure offre de mots, cette approche serait la plus directe. L'autre solution (celle de Stéphane) dépend des données qui sont structurées et ne les considère pas de manière contextuelle, l'approche de msw semble cependant avoir de meilleures jambes.Cela ressemble à un
.srt
fichier. Si c'est le cas, et si le nombre de lignes anglaises par sous-titre est toujours le même que le nombre de lignes allemandes, alors vous pouvez utiliser:Où
old.srt
et oùnew.srt
sont vos fichiers d'entrée et de sortie choisis.la source