2016-06-09 6 views
1

Ich versuche Satzlisten in Strings aufgeteilt zu schneiden:Python :: Schneidene Listen von Zeichenketten schiefgegangen

user = ['The', 'Macbeth', 'Tragedie'] #this list 
    plays = [] 

    hamlet = gutenberg.sents('shakespeare-hamlet.txt') 
    macbeth = gutenberg.sents('shakespeare-macbeth.txt') 
    caesar = gutenberg.sents('shakespeare-caesar.txt') 
    plays.append(hamlet) 
    plays.append(macbeth) 
    plays.append(caesar) 

    shakespeare = list(chain.from_iterable(plays)) # with this list 

'shakespeare' druckt wie folgt:

[['[', 'The', 'Tragedie', 'of', 'Hamlet', 'by', 'William', 'Shakespeare', '1599', ']'], ['Actus', 'Primus', '.'], ['Scoena', 'Prima', '.'], ['Enter', 'Barnardo', 'and', 'Francisco', 'two', 'Centinels', '.']...['FINIS', '.'], ['THE', 'TRAGEDIE', 'OF', 'IVLIVS', 'CaeSAR', '.']]

bestCount = 0 
    for sent in shakespeare: 
     currentCount = len(set(user).intersection(sent)) 
     if currentCount > bestCount: 
      bestCount = currentCount 
      answer = ' '.join(sent) 
    return ''.join(answer).lower(), bestCount 

return jedoch schneidet nicht richtig, das heißt, "Weiler" schneidet mit "Macbeth" ...

('the tragedie of hamlet , prince of denmarke .', 3)

wo ist der Fehler?

+0

Diese Shakespeare-Struktur sieht furchtbar seltsam und schlecht gebaut aus. Eine Liste von Listen mit Mitgliedern in der inneren Liste wie "['' ?? Was ist falsch mit einem einfacheren Ansatz, wo Sie einen Satz haben, der nur eine Folge von Wörtern ist, teilen Sie es mit 'split' (vielleicht Interpunktion ausfiltern) und rufen' set (that_list) .intersect (set (other_list_like_it)) '? –

+0

@ Two-BitAlchemist 'sent()' ist eine NLTK-Methode - ein Toolkit für die Computerlinguistik, das markierte Wörter usw. abruft. In diesem Fall ruft der send-Befehl Sätze durch Strings ab. Ich möchte jedoch das Korpus nach Autor und nicht nach Theaterstücken sortieren. –

+0

Was ist das eigentliche Problem, das Sie versuchen zu lösen? Sätze finden, die jedem Spiel gemeinsam sind? Vorkommen bestimmter Wörter finden? –

Antwort

0

Es hört sich nicht so an, als würden Sie Sätze hier verwenden. Das offensichtlichste Problem ist, dass Sie sich um die Anzahl der Vorkommen eines Wortes in einem Satz kümmern (was das Leben als Liste startet), und durch das Konvertieren in eine Menge reduzieren Sie alle wiederholten Wörter auf ein einziges Mal und verlieren diese Information.

Ich würde eher vorschlagen, jeder Satz der Mitglieder in Klein Umwandlung, etwa so:

mapped = map(str.lower, sentence) # may want list(map(...)) if on Py3 

ein dict von Zählungen wie folgt initialisieren:

In [6]: counts = {word.lower(): 0 for word in user} 

In [7]: counts 
Out[7]: {'macbeth': 0, 'the': 0, 'tragedie': 0} 

Dann, wie Sie Schleife über die Sätze, können Sie Mach so etwas wie:

In [8]: for word in counts: 
    ...:  counts[word] = max(counts[word], mapped.count(word)) 
    ...: 

In [9]: counts 
Out[9]: {'macbeth': 0, 'the': 1, 'tragedie': 1} 

Ich habe gerade einen Beispielsatz, aber Sie bekomme eine Vorstellung. Am Ende haben Sie die maximale Anzahl der Male, die das Wort des Benutzers in einem Satz erschien. Sie können die Datenstruktur ein wenig komplexer machen oder einen if-Statement-Test verwenden, wenn Sie auch den Satz, in dem er am häufigsten aufgetreten ist, beibehalten möchten.

Viel Glück!