Vous cherchez à automatiser la création de domaines dans JasperServer. Les domaines sont une « vue » des données pour la création de rapports ad hoc. Les noms des colonnes doivent être présentées à l'utilisateur de façon lisible. P>
Il y a plus de 2 000 pièces possibles de données à partir desquelles l'organisation pourrait théoriquement vouloir inclure dans un rapport. Les données proviennent de noms non convivial de l'homme tels que: p>
payperiodmatchcode labordistributioncodedesc dependentrelationship actionendoption actionendoptiondesc addresstype addresstypedesc historytype psaddresstype rolename bankaccountstatus bankaccountstatusdesc bankaccounttype bankaccounttypedesc beneficiaryamount beneficiaryclass beneficiarypercent benefitsubclass beneficiaryclass beneficiaryclassdesc benefitactioncode benefitactioncodedesc benefitagecontrol benefitagecontroldesc ageconrolagelimit ageconrolnoticeperiod p> blockQuote>
Question h2>
Comment changeriez-vous automatiquement ces noms: p>
- Code période de paie match li>
- Code de distribution du travail desc li>
- relation de dépendance li> ul>
Idées h2>
Utiliser Google Avez-vous dire moteur , mais je pense qu'il viole leurs TOS: p>
lynx -dump «url» | grep « Vouliez-vous dire » | awk ... code> p> li> ul>
Langues h2>
Toute langue est très bien, mais parseurs de texte tels que Perl serait probablement bien adapté. (Les noms de colonnes sont en anglais seulement.) P>
Inutiles Prefection h2>
Le but est pas 100% la perfection dans désagréger mots; le résultat suivant est acceptable: p>
- enrollmenteffectivedate -> Inscription Entrée en vigueur li>
- enrollmentenddate -> Inscrivez-Tend Hommes Date li>
- enrollmentrequirementset -> Inscription Set Exigence li> ul>
Peu importe ce que, un être humain devra revérifier les résultats et corriger beaucoup. Tailler un ensemble de résultats 2000 jusqu'à 600 modifications serait un gain de temps dramatique. Pour se focaliser sur certains em> cas ayant de multiples possibilités (par exemple, therapistname) est de manquer le point tout à fait. P>
6 Réponses :
Étant donné que certains mots pourraient être des sous-chaînes d'autres, en particulier avec plusieurs mots brisés ensemble, je pense que des solutions simples comme les regexes sont sorties. J'irais avec un parseur complet, mon expérience étant avec Antlr. Si vous voulez coller avec Perl, j'ai eu de la chance d'utiliser des analyseurs Antlr générés comme Java à travers Inline :: Java. P>
Ne nie pas ça. Je l'ai mis à la même raison, mais pour quelque chose, il n'y a pas d'autre moyen d'y arriver. On dirait dans ce cas que vous êtes dans la zone grise où un analyseur serait préférable, mais vous pouvez toujours obtenir sans un.
Parfois, Bruteforcing est acceptable: sortie: p> Voir aussi Un correcteur orthographique était un exploit majeur de génie logiciel . p> p>
Remarque: nécessite libfile-slurp-perl code>.
@Sinan, @Dave: Case d'angle: avantageuxCodeDededesc: code de tactage Desc code>
@Axeman je m'attends à ce qu'il y ait des cas d'angle, je reçois avantagenteCodeDededesc: indemnité d'action Code Desc code> car mon fichier
mots code> n'inclut pas TRACE B>; ) Je suppose que la bonne chose à faire est de gérer le cas où une partie de la chaîne d'origine n'est pas consommée. Par exemple,
Ageconrolagelimit: Limite d'âge Code> Je suppose que cela aurait dû être Contrôle B> plutôt que Conrol B>
Si le fichier de liste est un identifiant par ligne, il suffit de faire chomp (mes @identifiers = <>); code>.
@Dave une solution plus raffinée, vous permettant de (1) lire les identifiants de stdin code> ou un fichier externe, (2) spécifier un fichier de dictionnaire personnalisé, et (3) spécifier un fichier de sortie ou une sortie à
stdout code> est maintenant disponible sur mon blog: blog.nu42.com/2010/10/someimes-brute-force-solution-is.html
@Sinan: Je ne savais pas ce que c'était, mais c'était dans nos mots. Dictionary.reference.com/browse/tance Je pense que nous avons probablement plus de médecin mots dans ce fichier.
Au lieu de fouiller dans le fichier, vous voudrez peut-être rechercher les mots juste après l'espace en premier. Cela pourrait être plus intensif, mais faire une itération récursive sera plus correcte et, espérons-le, éviter des cas comme votre Taction code>.
@ vol7ron Je suis désolé, mais je peux comprendre ce que vous entendez par "rechercher les mots juste après l'espace d'abord" @Dave, il résoudra effectivement avantagecalcrulecodedesc code> et
bankaccountstatusdesc code> mais Vous devez dire au script
calc code> et
desc code> sont des mots.
@Sinan, en quelque sorte comme un lookahead en avant pour le mot suivant. Fondamentalement, n'allez pas sur le prochain ensemble jusqu'à ce que tous les mots ne soient trouvés. AvantageCalcrulédecededC code>, commencez par des mots commençant par
B code>, premier premier. Il trouve des avantages, mais avant de dire qu'il est correct, recherchez le mot suivant dans
Calcrulédecidec code>. Si à aucun moment, le mot futur n'existe pas, vous devez revenir au mot sélectionné précédent. par exemple après
dirigé code> est sélectionné, il n'y a pas de possibilités de mots qui commence par
ECI .. code>, donc revenir en arrière et sélectionnez
règle code>, alors vous pouvez aller de l'avant et vérifier les possibilités avec
d code> (
décider code>).
@ Vol7ron N'hésitez pas à coder cette solution. Supposons qu'il n'y a pas de chaîne avantageuxAccounditembed code> ou quelque chose comme ça dans les données source. Est-ce que
avantage code>,
comptabilisé code>,
élément code>,
lit code> ou
avantage code>,
,
Compte code>,
edit code>,
incorporé code>? En tout cas, je ne peux pas voir un moyen de vous assurer que a priori i> il n'y aura pas d'intrants problématiques. Cependant, cette méthode vous fera la majeure partie de la route avec le reste étant géré par le stagiaire de Dave.
@Sinan, oui je ne casse pas ce qui précède, je dis simplement que cela itération récursivement par section serait plus précis qu'autrement par le dictionnaire. Quant à votre avantageuxCountoundTEmbed code> exemple ci-dessus (excellent exemple BTW), je dirais que la seconde viendrait d'abord. Sauf si vous avez chuté à travers toutes les possibilités (très intensivité de la CPU) et vous auriez toujours besoin d'un mécanisme qui a pesé les valeurs / mots. Si vous ne vouliez pas pondérer les mots individuellement, vous pouvez configurer un schéma qui a vérifié la longueur minimale et a choisi les combos qui ont le plus grand min (ou quelque chose d'idiot comme ça).
@Sianan, comme pour le coder, je vous laisse plutôt la laisser à vous :) --- Deuxième pensée à ce qui précède ... stockez toutes les possibilités et laissez l'utilisateur décider.
@Dave merci pour les commentaires. J'aurais espéré un taux de réussite mieux que 70%, mais j'espère bien. J'ai vu votre code de golf (et cela ne convient vraiment pas au golf), mais je vous recommanderais de poser cela comme une question d'algorithme général. Peut-être qu'il y a un dictionnaire plus approprié que mots code> à cet effet. Mon objectif principal dans l'écriture de ce script consistait à voir à quel point la création d'une regex géante de l'ensemble du contenu de
mots code> effectué (c'est-à-dire à l'aide du temps de développeur le moins possible).
J'ai réduit votre liste à 32 termes atomiques que je m'inquiétais et les mettais dans l'arrangement le plus long dans une regex:
@Dave: si vous avez un dictionnaire de données - celui qui permet "DESC" de supporter invariablement "description" alors ce n'est pas un problème. Puisque vous n'abandonnez pas tous les articles de 2000 (et merci), nous ne pouvons pas dire que votre ensemble complet a des matchs "faux" aux mots plus longs dans l'exemple de dictionnaire de Sinan, que vous devrez accorder une liste de Termes atomiques est un moyen de contrôler le processus. Vous ne pouvez pas non plus dire combien vous devrez ajouter comme 'desc' code> et
'ps' code>, vous finirez donc à maintenir la liste de toute façon. Vous pouvez ajouter des cas baroques à votre code ou vous pouvez maintenir un dictionnaire de données.
@Dave, en outre, j'ai même ajouté "contrôle" à la liste - au cas où cela signifiait quelque chose.
Deux choses se produisent pour moi: p>
anag code> qui trouve des anagrammes. Après tout, "Time Piece" est un anagramme de "montre" a > ... Maintenant, il vous suffit de supprimer les faux positifs. Li>
ul>
Ne pas rechercher la perfection. Ajout de 6 000 espaces aux mots divisés prendrait 11 heures. Réduire cela à 1 heure résoudra le problème.
Voici un programme LUA qui essaie les matchs les plus longs d'un dictionnaire:
Peter Norvig possède un excellent script Python qui possède une fonction de segmentation de mots utilisant des statistiques Unigram / Bigram. Vous souhaitez jeter un coup d'œil à la logique pour la fonction segment2 dans ngrams.py. Les détails sont dans le chapitre Données des corpus de langue naturelle du livre Belles données (Segaran et Hammerbacher, 2009). http://norvig.com/ngrams/ p>
@Telent & ChristoToffer: Ni. Les mots sont divisés à l'aide d'un lexique de probabilités relatifs déterminés par des mots qui ont des mots à partir d'un corpus à base de texte concaténé avec un dictionnaire de mots anglais et de leurs lexemes correspondants. Le corpus fournit un contexte pour la segmentation.