Ecrire un tokenizer en Python
Je veux concevoir un générateur de jetons module en Python qui permet aux utilisateurs de spécifier générateur de jetons(s) à utiliser pour l'entrée. Par exemple, considérons le code suivant:
Q: qu'est Ce qu'un bon moyen pour y parvenir? Un: je ne suis pas si sûr. Je pense que je
va utiliser Python.
Je veux être en mesure de fournir NLTK de la segmentation de la phrasesent_tokenize()
comme une option, car il fonctionne bien dans de nombreux cas, et je ne veux pas ré-inventer la roue. En plus de cela, je tiens également à fournir un grain plus fin de la segmentation du générateur de (quelque chose le long des lignes d'un règle-moteur). Laissez-moi vous expliquer:
Supposer que j'fournisseur d'un couple de des générateurs de jetons:
SENTENCE # Tokenizes the given input by using sent_tokenize()
WORD # Tokenizes the given input by using word_tokenize()
QA # Tokenizes using a custom regular expression. E.g., Q: (.*?) A: (.*?)
Je veux soutenir règles comme suit:
- QA -> PHRASE: Appliquer l'assurance de la qualité générateur de jetons en premier, suivi par la phrase tokenizer
- QA: Appliquer seulement l'assurance de la qualité tokenizer
Par conséquent, la sortie attendue est comme suit:
1. QA -> PHRASE
[
('QUESTION',
('SENTENCE', 'What is a good way to achieve this?'),
),
('ANSWER',
('SENTENCE', 'I am not so sure', 'I think I will use Python')
)
]
2. QA
[
('QUESTION', 'What is a good way to achieve this?'),
('ANSWER', 'I am not so sure. I think I will use Python')
]
Qu'est ce qu'un bon design pour y parvenir?
source d'informationauteur Legend
Vous devez vous connecter pour publier un commentaire.
Que la segmentation est facile en Python, je me demandais ce que votre module est prévu pour fournir.
Je veux dire que lors du démarrage d'un morceau de logiciel d'une bonne conception plutôt provient de la réflexion sur les scénarios d'usage de considérer que les structures de données en premier.
Vos exemples de résultats attendus sont un peu confus.
Je suppose que vous voulez le des générateurs de jetons de retour nom sur le côté gauche et une liste de jetons sur le côté droit.
J'ai joué un peu pour obtenir des résultats similaires, mais l'utilisation de listes pour faciliter la manipulation:
Btw. Python/Lib/tokenize.py (pour le code Python lui-même) pourrait être intéressant de regarder comment gérer les choses.
Si je comprends correctement à la question, puis je ne pense que vous devriez réinventer la roue. Je voudrais mettre en œuvre des machines d'état pour les différents types de segmentation en unités que vous voulez et utiliser python dictionnaires pour sauver les jetons.
http://en.wikipedia.org/wiki/Finite-state_machine
Exemple de l'état de la machine qui va prendre une phrase avec des espaces et d'imprimer les mots, bien sûr, vous pourriez faire spécifiques, par exemple dans des moyens plus faciles! Mais avec l'état de machines, en général, vous obtenez le temps linéaire, et peut-costumize facilement!
http://docs.python.org/2/library/collections.html#collections.Counter
Ensuite, vous pouvez par exemple utiliser ce python structure de données pour l'enregistrement de vos jetons. Je pense que c'est parfaitement adapté à vos besoins!
Espère que c'était de l'aide.
J'ai écrit cette simple générateur de jetons aujourd'hui, le point est à l'appui d'une simple DSL qui a des expressions telles que:
a = a + b
funcCall(b,c)
a < b and b > c
et de soutien pas de nidification de l'arithmétique plus profond que le précédent. En d'autres termes, le langage le plus simple de telle sorte que vous pouvez spécifier à la fois la flèche conditions et les codes d'accès de la machine d'état. J'ai essayé les solutions plus complexes, mais a échoué. Pourquoi avoir indéfiniment récursive expression de soutien si vous savez qu'il y a 100% de chance qu'il ne sera pas utilisé? De même, je suis en limitant la
and
's sur un bord de 5, sinon la machine de l'etat semble unweildy.or
est géré par la machine de l'etat lui-même: les flèches ont naturellement alternative ouor
logique.Ce n'est pas complètement testé, mais sur
1 < 0 and 0 > 1
(oui, une déclaration qui est toujours faux, je suis à l'aide d'un assortiment aléatoire de la flèche de texte par défaut pour les aider dans leur travail), les jetons sont retournés dans l'ordre correct.Si ils finissent par ne pas être renvoyé dans le bon ordre, il a à voir avec la façon dont je gère la
index
var qui est censé être l'endroit où ils devraient obtenir inséré dans les jetons (par rapport à la fin). J'ai essayé de garder la liste des jetons et les entrées de la liste, dans la même liste, et c'était un grand désordre. Cette version semble assez décent.Je ne sais pas si il sera la suite de vos besoins, mais il est clair que je suis en train de faire de l'utiliser, alors peut-être que d'autres en feront de même.
Ma demande a un ensemble fixe de types de jeton, mais cela peut être utilisé pour ce que vous voulez: le code de l'utilisateur insère simplement un nouveau type de jeton (l'ordre est important) avec expression régulière.