Je dois nettoyer certaines informations d'OCR qui reconnaît l'écriture manuscrite comme gibberish. Toute suggestion pour une regex pour nettoyer les caractères aléatoires? Exemple:
12 Réponses :
Eh bien, un groupe de symboles correspondrait à un peu de gibberish. Peut-être vérifier contre un dictionnaire pour les mots? p>
Il semble y avoir beaucoup de pauses de ligne où se trouvent Gibberish, de sorte qu'un indicateur peut aussi être un indicateur. P>
J'ai fait des recherches à l'UNI il y a quelques années autour de l'extraction de phrase (vous faites un peu le contraire). Il y a beaucoup de papiers (par exemple, portail.acm.org/citation.cfm?id= 1097059 ) dessus, mais malheureusement, il n'y a pas de solution unique "Hit-All".
problème intéressant. p>
Si cela est représentatif, je suppose que vous pourriez créer une bibliothèque de mots communs et supprimer toute ligne qui ne correspond à aucun d'entre eux. p>
ou peut-être que vous pourriez correspondre aux caractères de caractère et de ponctuation et de voir s'il existe un rapport de rapport fiable, ou simplement une fréquence d'occurrence de certains caractères qui le signalent comme gibberish. p>
Peu importe, je pense qu'il y aura une logique de programmation, pas simplement une seule expression régulière. p>
Je suppose qu'une regex ne vous aiderait pas ici. La regex correspondrait essentiellement à une entrée déterministe à I.e. Une regex aura un ensemble de modèles prédéfinis qu'il correspondra. Et Gibberish serait dans la plupart des cas au hasard. Une solution serait d'inverser le problème, c'est-à-dire correspondre au texte pertinent au lieu de faire correspondre le gibberish. P>
L'une des solutions SimplepleSet (pas impliquant des regexpes): p>
#pseudopyTon p>
number_of_punct = somme ([1 si c.ispunct () 0 pour C en ligne]) p>
si number_of_punct> len (ligne) / 2: line_is_garbage () p> blockQuote>
Eh bien. Ou Gude Regexpish S / [!, '"@ # ~ $% ^ &] {5,} // g p>
Rien. Retirez-le à la main plus tard. Ne vous attendez pas à ce que l'heuristique élimine toutes les ordures. Proverbe de la journée: "Ne jetez pas le bébé avec l'eau du bain".
Regex ne vous aidera pas ici. Je dirais que si vous avez le contrôle de la partie de reconnaissance, concentrez-vous sur une meilleure qualité là-bas: http://www.neurogy.com/ocpreproc.html P>
Vous pouvez également demander à l'utilisateur de vous aider et de spécifier le type de texte avec lequel vous travaillez. par exemple. S'il s'agit d'une page d'un livre, vous vous attendriez à ce que la majorité des lignes soit la même longueur et constitue principalement des lettres, des espaces et une ponctuation. P>
Je réclamerais une regex comme "toute ponctuation suivie de quoi que ce soit, sauf un espace, c'est du spam".
donc dans .net C'est peut-être quelque chose comme p>
.Replace(" \\p{2,} ", "");
> Je réclamerais une regex comme "toute ponctuation suivie de quoi que ce soit, à l'exception d'un espace, c'est du spam". Pas toujours, cependant. Certains noms de famille ont des traits d'union. Non seulement les noms de famille (envisagez-moi non). Aussi "citations" avec la ponctuation.
Vrai; Ensuite, n'incluez pas la double citation dans cette partie de la regex. Je ne pense pas qu'il recherche un système infaillible; juste quelque chose à faire une «première coupe».
Une simple heuristique, semblable à Anonyme Réponse:
listA = [0,1,2..9, a,b,c..z, A,B,C,..Z , ...] // alphanumerical symbols listB = [!@$%^&...] // other symbols Na = number_of_alphanumeric_symbols( line ) Nb = number_of_other_symbols( line ) if Na/Nb <= garbage_ratio then // garbage
Cela suppose que toute la ligne est soit une poubelle, mais elle n'est pas, mais basée sur l'échantillon, c'est une chose raisonnable à assumer.
Oui, c'est pour filtrer des lignes entières. Supprimer les ordures mélangées avec normal i> le texte ne sera pas aussi simple :-)
Aucune idée de ce que cela fonctionnerait, mais j'ai considéré ce problème dans le passé, inutilement. J'ai à l'occasion avec un petit appareil programmatique appelé Chaîne Markov P>
Maintenant, l'article Wikipedia n'aura probablement pas beaucoup de sens avant de voir certaines des autres choses qu'une chaîne de Markov est bonne pour. Cet exemple de la chaîne de Markov en action est ce Générateur en flecking . Un autre exemple est le MEGAHAL CHATBOT. P>
Grèce, c'est Gibberish qui ressemble à des mots. Les chaînes Markov fournissent un moyen de générer de manière aléatoire une séquence de lettres, mais de pondérer les choix aléatoires à imiter les modèles de fréquence d'un corpus examiné. Donc, par exemple, étant donné la lettre "T", la lettre H est plus susceptible de se présenter ensuite que toute autre lettre. Vous examinez donc un corpus (dire des journaux ou des publications de blog) pour produire une sorte d'empreinte digitale de la langue que vous ciblez. p>
Maintenant que vous avez cette table de fréquence / empreinte digitale, vous pouvez examiner votre exemple de texte et évaluer chaque lettre en fonction de la probabilité d'entre elles apparaissant. Ensuite, vous pouvez signaler les lettres sous un seuil de seuil particulier pour le retrait. En d'autres termes, un filtre surprise. Filtrer des surprises. P>
Il y a une marge de manœuvre pour la manière dont vous générez vos tables de frequé. Vous n'êtes pas limité à une lettre en suivant une autre. Vous pouvez construire une table de fréquence qui prédit quelle lettre suivra probablement chaque digraphe (groupe de deux lettres) ou chaque trigraphe, ou quadgraphe. Vous pouvez travailler de l'autre côté, prédire des trigraphes probables et improbables de figurer dans certaines positions, compte tenu du texte précédent. P>
C'est un peu comme une regex fuzzy. Plutôt que de correspondre ou pas de correspondance, tout le texte est marqué sur une balance coulissante en fonction de la façon dont il est similaire à votre texte de référence. P>
J'ai fait un combo d'élimination des lignes qui ne contiennent pas d'au moins deux mots de 3 lettres ou d'un mot de 6 lettres. P>
([A-Z | A-Z] {3,} \ s) {2,} | ([A-Z | A-Z] {6,}) P>
J'ajouterais une comparaison de dictionnaire pour vous assurer que les mots qu'il trouve sont réels et pas seulement des lettres aléatoires.
J'aime la réponse de @ Breton - Je suggère d'utiliser son approche de corpus également avec une bibliothèque de «mauvaises scanns» connues, ce qui pourrait être plus facile à identifier car la «déchets» a plus de cohérence interne que le «bon texte» s'il vient De mauvaises analyses OCR (le nombre de glyphes distincts est inférieur par exemple). p>
Une autre bonne technique consiste à utiliser un vérificateur orthographique / dictionnaire et recherchez les «mots» après avoir éliminé les trucs non lisibles avec regex. P>
Voici une implémentation Perl du coller le texte ci-dessus après sortie: p> Garbage_ratio Code> Heuristic: __ données __ code> ci-dessus (ne pas répéter le texte ici pour économiser de l'espace). Bien sûr, l'utilisation de la section __ __ code> est destinée à poster un script autonome. Dans la vraie vie, vous auriez du code pour ouvrir le fichier, etc. P>
+1 Parce que c'est une question intéressante, même si je soupçonne que vous n'obtiendrez pas une réponse qui fonctionne.
C'est une bonne question, la reconnaissance de mots / expression (ou l'autre sens) est un sujet brûlant dans le cadre de l'AI.
Je pense fortement qu'une regex est le mauvais outil de ce travail.
Attendez ... Est-ce que ... 1337 Speek?
Merci pour toutes les réponses / suggestions. Je vais expérimenter avec les réponses et voir lequel est le gagnant.
Je n'utiliserais vraiment pas d'expressions régulières pour cela. Vous avez besoin d'une sorte d'algorithme heuristique qui vérifie le nombre de caractères alphanumériques, le nombre de marques de ponctuation, etc., puis détermine si une ligne est valide ou non. Si l'entrée est comme vous le décrivez ci-dessus, cela devrait être assez facile à atteindre. Par exemple, vous pouvez essayer de détruire une ligne lorsque le nombre de caractères de ponctuation est supérieur à 15% des caractères totaux de cette ligne. Évidemment, cela doit être un peu modifié et peut être rendu beaucoup plus intelligent.