2017-12-19 1 views
-1

Ich brauche nur die Wörter aus einer Datei, deren POS-Tags sind: 'NN'oder' NNP 'oder' NNS 'oder' NNPS '. Mein Abtastwerteingang ist:Wie kann man Wörter mit Nomen-Tags nur aus einer Datei abrufen?

[['For,IN', ',,,', 'We,PRP', 'the,DT', 'divine,NN', 'caused,VBD', 'apostle,NN', 'We,PRP', 'vouchsafed,VBD', 'unto,JJ', 'Jesus,NNP', 'the,DT', 'son,NN', 'of,IN', 'Mary,NNP', 'all,DT', 'evidence,NN', 'of,IN', 'the,DT', 'truth,NN', ',,,', 'and,CC', 'strengthened,VBD', 'him,PRP', 'with,IN', 'holy,JJ'], [ 'be,VB', 'nor,CC', 'ransom,NN', 'taken,VBN', 'from,IN', 'them,PRP', 'and,CC', 'none,NN', '\n']] 

Meine erwartete Ausgabe ist:

[ 'divine', 'apostle','Jesus', 'son','Mary', 'evidence', 'truth', 'ransom', 'none'] 

Antwort

1

Da Ihr Eingang ist ein list eines list, könnten Sie ein verwenden nested list comprehension:

a_list = [['For,IN', ',,,', 'indeed,RB', ',,,', 'We,PRP', 'vouchsafed,VBD', 'unto,JJ', 'Moses,NNPS', 'the,DT', 'divine,NN', 'writ,NN', 'and,CC', 'caused,VBD', 'apostle,NN', 'after,IN', 'apostle,NN', 'to,TO', 'follow,VB', 'him,PRP', ';,:', 'and,CC', 'We,PRP', 'vouchsafed,VBD', 'unto,JJ', 'Jesus,NNP', ',,,', 'the,DT', 'son,NN', 'of,IN', 'Mary,NNP', ',,,', 'all,DT', 'evidence,NN', 'of,IN', 'the,DT', 'truth,NN', ',,,', 'and,CC', 'strengthened,VBD', 'him,PRP', 'with,IN', 'holy,JJ']] 

pos_tags = (',NN', ',NNP', ',NNS', ',NNPS') 

nouns = [s.split(',')[0] for sub in a_list for s in sub if s.endswith(pos_tags)] 

print(nouns) 

['Moses', 'divine', 'writ', 'apostle', 'apostle', 'Jesus', 'son', 'Mary', 'evidence', 'truth'] 
>>> 

bearbeiten:

a_list = [['For,IN', ',,,', 'We,PRP', 'the,DT', 'divine,NN', 'caused,VBD', 'apostle,NN', 'We,PRP', 'vouchsafed,VBD', 'unto,JJ', 'Jesus,NNP', 'the,DT', 'son,NN', 'of,IN', 'Mary,NNP', 'all,DT', 'evidence,NN', 'of,IN', 'the,DT', 'truth,NN', ',,,', 'and,CC', 'strengthened,VBD', 'him,PRP', 'with,IN', 'holy,JJ'], ['be,VB', 'nor,CC', 'ransom,NN', 'taken,VBN', 'from,IN', 'them,PRP', 'and,CC', 'none,NN', '\n']] 
pos_tags = (',NN', ',NNP', ',NNS', ',NNPS') 

nouns = [s.split(',')[0] for sub in a_list for s in sub if s.endswith(pos_tags)] 

print(nouns) 

['divine', 'apostle', 'Jesus', 'son', 'Mary', 'evidence', 'truth', 'ransom', 'none'] 
>>> 
+0

Es gibt den Index des Listenbereichs außerhalb des Bereichs. – Nisa

+0

@Nisa, bitte lesen Sie den Code arbeiten bei [repl.it] (https://repl.it/repls/RedSandyBluefish). – srig

+0

Ich habe so eingegeben: [Für, IN ',' ,,, ',' Wir, PRP ',' der, DT ',' göttlich, NN ',' verursacht, VBD ',' Apostel, NN ',' Wir, PRP ',' voobsafed, VBD ',' zu, JJ ',' Jesus, NNP ',' der, DT ',' Sohn, NN ',' von, IN ',' Mary, NNP ', "alle, DT", "Beweise, NN", "von, IN", "der, DT", "Wahrheit, NN", ",,,", "und, CC", "gestärkt, VBD", "er" , "PR,", "mit, IN", "heilig, JJ"], [sein, VB ', noch, CC', 'Lösegeld, NN', 'genommen, VBN', 'von, IN', 'sie , PRP ',' und, CC ',' keine, NN ',' \ n ']] – Nisa

2

Hier ist eine einfache Methode, basierend auf Listenkomprehensionen:

x = ['For,IN', ....] 
y = [w.split(',')[0] for w in x if ',NN' in w] 

Es besteht im Wesentlichen über alle Worte iteriert, nimmt nur diejenigen, die ",NN" enthalten und schneidet den Teil vor dem Komma aus.

+0

Es eine leere Liste gibt. Wie Sie in meiner Beispieleingabe sehen können, handelt es sich um eine Liste innerhalb einer Liste. – Nisa

+0

Nun, ersetzen Sie x durch x [0]. – Pavel

0

Sie können in nur einem etwas wie dies mit regulären Ausdruck versuchen Linie:

import re 
pattern=r'\w+(?=,NN)' 
data=[['For,IN', ',,,', 'We,PRP', 'the,DT', 'divine,NN', 'caused,VBD', 'apostle,NN', 'We,PRP', 'vouchsafed,VBD', 'unto,JJ', 
    'Jesus,NNP', 'the,DT', 'son,NN', 'of,IN', 'Mary,NNP', 'all,DT', 'evidence,NN', 'of,IN', 'the,DT', 'truth,NN', ',,,', 
    'and,CC', 'strengthened,VBD', 'him,PRP', 'with,IN', 'holy,JJ'], 
['be,VB', 'nor,CC', 'ransom,NN', 'taken,VBN', 'from,IN', 'them,PRP', 'and,CC', 'none,NN', '\n']] 

print(list(map(lambda x:list(filter(lambda y:re.search(pattern,y)!=None,x)),data))) 

Ausgabe:

[['divine,NN', 'apostle,NN', 'Jesus,NNP', 'son,NN', 'Mary,NNP', 'evidence,NN', 'truth,NN'], ['ransom,NN', 'none,NN']] 

Nun, wenn Sie ohne 'NN' wollen, dann:

print([re.search(pattern,j).group() for i in data for j in i if isinstance(i,list) if re.search(pattern,j)!=None]) 

Ausgang:

['divine', 'apostle', 'Jesus', 'son', 'Mary', 'evidence', 'truth', 'ransom', 'none'] 
Verwandte Themen