2017-08-05 3 views
0

J'ai un fichier contenant des chaînes commeParse chaîne de morceau de NLTK pour former l'arbre

Tree('S', [Tree('NP', [('criminal', 'JJ'), ('lawyer', 'NN')]), Tree('NP', 
[('new', 'JJ'), ('york', 'NN')])]) 

Y at-il une fonction de python qui parse la chaîne pour produire à nouveau la structure d'arbre? J'ai essayé la fonction Tree.fromstring mais elle n'analyse pas.

je produis ces chaînes comme ci-dessous

>>> import nltk 
>>> from nltk import pos_tag 
>>> pattern = """NP: {<DT>?<JJ>*<NN>} 
... VBD: {<VBD>} 
... IN: {<IN>}""" 
>>> NPChunker = nltk.RegexpParser(pattern) 
>>> sentence = 'criminal lawyer new york'.split() 
>>> pos_tag(sentence) 
[('criminal', 'JJ'), ('lawyer', 'NN'), ('new', 'JJ'), ('york', 'NN')] 
>>> result = NPChunker.parse(pos_tag(sentence)) 
>>> result 
Tree('S', [Tree('NP', [('criminal', 'JJ'), ('lawyer', 'NN')]), Tree('NP', 
[('new', 'JJ'), ('york', 'NN')])]) 

Merci à l'avance.

Répondre

3

Lorsque vous

>>> result = NPChunker.parse(pos_tag(sentence)) 
>>> result 
Tree('S', [Tree('NP', [('criminal', 'JJ'), ('lawyer', 'NN')]), Tree('NP', [('new', 'JJ'), ('york', 'NN')])]) 

vous voyez une représentation de chaîne de la structure de données en mémoire. Lorsque vous tapez result à l'invite de l'interpréteur, ce que vous obtenez est le même que ce que vous obtenez si vous tapez repr(result) à l'invite de l'interpréteur. Il semble que vous ayez enregistré cette représentation de chaîne dans un fichier. C'est regrettable car cette représentation n'est pas acceptable pour Tree.fromstring(). Pour enregistrer une version acceptable dans un fichier, vous devez écrire le str() (pas le repr()) de l'arborescence. Vous pouvez voir la différence ici:

>>> result 
Tree('S', [Tree('NP', [('criminal', 'JJ'), ('lawyer', 'NN')]), Tree('NP', [('new', 'JJ'), ('york', 'NN')])]) 
>>> str(result) 
'(S (NP criminal/JJ lawyer/NN) (NP new/JJ york/NN))' 

Tree.fromstring() attend la deuxième de ces formats.

Pour vérifier que cela va faire ce que vous voulez:

>>> result2 = nltk.Tree.fromstring(str(result)) 
>>> result2 
Tree('S', [Tree('NP', ['criminal/JJ', 'lawyer/NN']), Tree('NP', ['new/JJ', 'york/NN'])]) 

Mais c'est pour l'avenir. Vous devez réparer le fichier que vous avez. Effectuez les opérations suivantes:

>>> from nltk import Tree 
>>> input_string = "Tree('S', [Tree('NP', [('criminal', 'JJ'), ('lawyer', 'NN')]), Tree('NP', [('new', 'JJ'), ('york', 'NN')])])" 

Je fais une mission en ligne, mais bien sûr, vous allez lire input_string à partir d'un fichier texte.

>>> parsed_tree = eval(input_string) 
>>> type(parsed_tree) 
<class 'nltk.tree.Tree'> 
>>> str(parsed_tree) 
'(S (NP criminal/JJ lawyer/NN) (NP new/JJ york/NN))' 

Cette solution peut être utilisée comme réparation d'urgence ponctuelle pour votre fichier. Ne pas le faire comme une procédure régulière.

+0

Merci @BoarGules – user2745862