2017-10-20 21 views
-3

Je travaille avec Python "Pattern.en" package qui me donne le sujet, l'objet et d'autres détails sur une phrase particulière. Mais je veux stocker cette sortie dans une autre variable ou dans une Dataframe pour un traitement ultérieur que je ne suis pas en mesure de faire.Table de modèles pour Pandas DataFrame

Toutes les entrées seront utiles.

Un exemple de code est mentionné ci-dessous à titre de référence.

from pattern.en import parse 
from pattern.en import pprint 
import pandas as pd 

input = parse('I want to go to the Restaurant as I am hungry very much') 
print(input)  
I/PRP/B-NP/O want/VBP/B-VP/O to/TO/I-VP/O go/VB/I-VP/O to/TO/O/O the/DT/B-NP/O Restaurant/NNP/I-NP/O as/IN/B-PP/B-PNP I/PRP/B-NP/I-PNP am/VBP/B-VP/O hungry/JJ/B-ADJP/O very/RB/I-ADJP/O much/JJ/I-ADJP/O 

pprint(input) 

     WORD TAG CHUNK ROLE ID  PNP LEMMA             
     I PRP NP  -  -  -  -  
     want VBP VP  -  -  -  -  
     to TO  VP^ -  -  -  -  
     go VB  VP^ -  -  -  -  
     to TO  -  -  -  -  -  
     the DT  NP  -  -  -  -  
Restaurant NNP NP^ -  -  -  -  
     as IN  PP  -  -  PNP -  
     I PRP NP  -  -  PNP -  
     am VBP VP  -  -  -  -  
    hungry JJ  ADJP  -  -  -  -  
     very RB  ADJP^ -  -  -  -  
     much JJ  ADJP^ -  -  -  -  

Veuillez noter la sortie des instructions print et pprint. J'essaie de stocker l'un d'entre eux dans une variable. Il serait préférable que je puisse stocker la sortie de l'instruction pprint dans une structure de données car elle est en format tabulaire.

Mais quand j'essaie de le faire que je rencontre l'erreur mentionnée ci-dessous

df = pd.DataFrame(input) 

ValueError: DataFrame constructor not properly called!

+0

Semble basique, avez-vous lu la documentation de Pandas? https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.html Votre erreur indique que vous n'appelez pas le constructeur correctement - et cela semble en effet être le cas. – Jacob

+0

Merci @Jacob. Mais mon problème n'est pas comment résoudre l'erreur que j'ai eue. Il s'agit de stocker la sortie du package pattern.en dans une variable ou Dataframe. Alors s'il vous plaît laissez-moi savoir si vous avez une idée à ce sujet. Espérons que ce n'est pas un élément de base et vous pouvez repenser à supprimer la downvote si vous pensez que ce n'est pas la base – JKC

Répondre

1

Prendre source de table fonction, je viens avec ce

from pattern.en import parse 
from pattern.text.tree import WORD, POS, CHUNK, PNP, REL, ANCHOR, LEMMA, IOB, ROLE, MBSP, Text 
import pandas as pd 

def sentence2df(sentence, placeholder="-"): 
    tags = [WORD, POS, IOB, CHUNK, ROLE, REL, PNP, ANCHOR, LEMMA] 
    tags += [tag for tag in sentence.token if tag not in tags] 
    def format(token, tag): 
     # Returns the token tag as a string. 
     if tag == WORD : s = token.string 
     elif tag == POS : s = token.type 
     elif tag == IOB : s = token.chunk and (token.index == token.chunk.start and "B" or "I") 
     elif tag == CHUNK : s = token.chunk and token.chunk.type 
     elif tag == ROLE : s = token.chunk and token.chunk.role 
     elif tag == REL : s = token.chunk and token.chunk.relation and str(token.chunk.relation) 
     elif tag == PNP : s = token.chunk and token.chunk.pnp and token.chunk.pnp.type 
     elif tag == ANCHOR : s = token.chunk and token.chunk.anchor_id 
     elif tag == LEMMA : s = token.lemma 
     else    : s = token.custom_tags.get(tag) 
     return s or placeholder 

    columns = [[format(token, tag) for token in sentence] for tag in tags] 
    columns[3] = [columns[3][i]+(iob == "I" and " ^" or "") for i, iob in enumerate(columns[2])] 
    del columns[2] 
    header = ['word', 'tag', 'chunk', 'role', 'id', 'pnp', 'anchor', 'lemma']+tags[9:] 

    if not MBSP: 
     del columns[6] 
     del header[6] 

    return pd.DataFrame(
     [[x[i] for x in columns] for i in range(len(columns[0]))], 
     columns=header, 
    ) 

Utilisation

>>> string = parse('I want to go to the Restaurant as I am hungry very much') 
>>> sentence = Text(string, token=[WORD, POS, CHUNK, PNP])[0] 
>>> df = sentence2df(sentence) 
>>> print(df) 
      word tag chunk role id pnp lemma 
0   I PRP  NP - - -  - 
1   want VBP  VP - - -  - 
2   to TO VP^ - - -  - 
3   go VB VP^ - - -  - 
4   to TO  - - - -  - 
5   the DT  NP - - -  - 
6 Restaurant NNP NP^ - - -  - 
7   as IN  PP - - PNP  - 
8   I PRP  NP - - PNP  - 
9   am VBP  VP - - -  - 
10  hungry JJ ADJP - - -  - 
11  very RB ADJP^ - - -  - 
12  much JJ ADJP^ - - -  - 
+0

Wow. C'est génial. tu es génial @pacholik – JKC