Génération automatique d’expressions regex via la méthode d’escalade
L’écriture d’expressions regex, pour extraire des données, peut être fastidieuse, longue et ennuyeuse. À un moment donné, vous pouvez atteindre un point de rupture et commencer à vous demander si le processus pourrait être automatisé. J’ai récemment atteint ce point et décidé de construire un générateur d’expression de regex simple.
J’ai fini par expérimenter avec un beaucoup de solutions différentes mais finalement décidé d’utiliser Hill Climbing. J’ai décidé d’utiliser une terminaison statique pour l’expression d’expression régulière. Le processus tenterait de créer des expressions uniques pour chaque valeur correspondant à cette fin statique.
- Traduisez l’expression regex vers / depuis la représentation des gènes.
- Mutateurs géniques / individuels
- Méthodes de fitness
- Grimpeur simple de colline
Cela impliquera une cartographie entre les deux mondes. Je combinerai des caractères constants (a, b, c, etc.) avec des expressions possibles ( s, [a-z], etc). Création d’un ensemble d’éléments d’expression autorisés.
IntegerToBinaryString:
- Méthode pour traduire un entier en représentation binaire. Un exemple serait 31 -> «11111».
BinaryGeneFactory:
- Usine pour créer un gène et utiliser cette technique pour générer un individu complet.
StringToMapping:
- Cette méthode traduira un binaire (gène) en une expression regex réelle.
KeyArrayToRegex:
- Contrôle la transformation d’expression d’expression régulière à partir d’un individu. ‘Transform_and_compress’ tentera de compresser l’expression en ajoutant ‘+?’ À des éléments consécutifs. Un exemple r ’ s s’ compression vers r ’ s +?’.
Configuration du dictionnaire binaire en expression:
La mutation peut être maintenue assez simple car un gène est représenté comme binaire. Nous avons juste besoin de le remplacer par un autre créé aléatoirement.
Nous aimerions également que nos expressions regex se développent dynamiquement (in / out). Pour ce faire, nous avons configuré une autre méthode de mutation qui agit sur l’individu entier. Il ajoutera / supprimera de la fin si le pourcentage correspond à leurs seuils respectifs.
- Exemple en croissance: r ’ s w:’ peut devenir r ’ w s w:’
- Exemple de rétrécissement: r ’ w s w:’ peut se réduire à r ’ s w:’
Ceci est un monstre. Je me suis retrouvé avec 3 méthodes qui ont contribué à une forme physique globale. Les gènes et l’individu sont contrôlés. Dans l’ensemble, nous essayons d’encourager une expression plus longue par rapport à une plus petite.
Pour les gènes, nous commençons par l’expression la plus proche de la fin statique et développons lentement l’expression globale. Si nous obtenons une correspondance potentielle, nous ajoutons une fraction à la forme physique (bonne chose). Avec chaque article, une plus grande partie de la forme physique globale est un enjeu. Donc 4 éléments valent mieux que 2. Ces méthodes utiliseront ce type de réflexion.
Pour les individus, nous vérifions l’expression entière et ajoutons une fraction à la forme physique en fonction du nombre de correspondances trouvées. Nous voulons seulement encourager un match unique et unique ici. Mais pas pour décourager complètement plusieurs correspondances.
Enfin, si l’adéquation est la même entre les itérations mais que les longueurs sont différentes, nous souhaitons favoriser la plus grande expression. C’est un peu gênant mais cela semble faire l’affaire.
Notre grimpeur de colline ne s’occupe que de garder le meilleur individu. Si une mutation entraîne une augmentation de notre forme physique, nous progressons avec elle tout en rejetant l’ancienne version. Si le nouvel individu est pire, nous conservons la version actuelle. Nous cherchons seulement à aller de l’avant.