Großbuchstaben ...?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Denkow
User
Beiträge: 24
Registriert: Donnerstag 10. Januar 2013, 18:57

mutetella hat geschrieben: Was muss geschehen, wenn ein Wort nicht mit einem Großbuchstaben beginnt?
stimmt, das weiß meine funktion ja noch gar nicht. also muss ich wohl da noch was einfügen.
dann muss meine funktion das wort "ignorieren" und einfach überspringen?!
mutetella hat geschrieben: Wenn ich Dich richtig verstanden habe, möchtest Du ja immer 2 Wörter mit Großbuchstaben zusammen in einer Liste, außer zwischen diesen beiden Wörtern liegt ein Wort mit Kleinbuchstaben...
ganz genau!
BlackJack

@mutetella: Wenn man eine Liste, oder allgemein ein „iterable”, hat und jeweils zwei aufeinander folgende Elemente zu einem Tupel zusammenfassen möchte, dann kann man schon `zip()` dazu verwenden. Allerdings anders als Denkow das getan hat. Ungetestet:

Code: Alles auswählen

def pairwise(iterable):
    iterator = iter(iterable)
    return zip(iterator, iterator)
In Python 2.x kann man `itertools.izip()` verwenden um das ganze „lazy” zu machen.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@BlackJack:
Schon, nur besteht die Aufgabenstellung ja darin, dass nur direkt aufeinander folgende Treffer ein Paar bilden dürfen. Und ich glaube, dass Denkow gerade daran 'hängt'...

Wobei jetzt natürlich interessant wäre, für was das Ergebnis benötigt wird. Ich ahne, dass es darum geht, Vor- und Nachname zu extrahieren. Und ich kann mir jetzt nicht vorstellen, wie das ohne eine gehörige Portion Magie funktionieren kann, Beispiel 'Max von Mustermann'.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

@mutetella: Ui, daran hatte ich gar nicht gedacht. :oops:

Edit: Was gleich die nächste Frage aufwirft was bei mehr als zwei aufeinanderfolgenden Worten mit Grossbuchstaben passieren soll. Max Peter Mustermann. :-)
Denkow
User
Beiträge: 24
Registriert: Donnerstag 10. Januar 2013, 18:57

ja genau daran hänge ich...

solche ausnahmen wie "Max Peter Mustermann" werden jetzt einfach mal ignoriert :D
Denkow
User
Beiträge: 24
Registriert: Donnerstag 10. Januar 2013, 18:57

Keiner mehr ne Idee? :K
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Da es mich in den Fingern gejuckt hat:

Code: Alles auswählen

In [3]: def proper_noun_pairs(words):
    pairs = []
    current = []
    for word in words:
        if word[0].isupper():
            current.append(word)
        else:
            current = []
        if len(current) == 2:
            pairs.append(tuple(current))
            current = []
    return pairs

In [4]:proper_ noun_pairs("Max Mustermann ging in den Boesen Wald hinein".split())
Out[4]: [('Max', 'Mustermann'), ('Boesen', 'Wald')]
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Noch 'ne Variante:

Code: Alles auswählen

def get_uppercase_pairs(sentence):
    pairs = []
    previous = ' '
    for word in sentence.split():
        if word[0].isupper() and previous[0].isupper():
            pairs.append((previous, word))
        previous = word
    return pairs

sentence = "Max Mustermann ging in den Boesen Wald hinein"
print get_uppercase_pairs(sentence)
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Und hier ist meine:

Code: Alles auswählen

def group_uppers(sentence):
    result = []
    pair = []
    for word in sentence.split()[1:]:
        if word[0].isupper():
            pair.append(word)
        else:
            if pair:
                result.append(pair)
                pair = []
        if len(pair) == 2:
            result.append(pair)
            pair = []
    if pair:
        result.append(pair)
    return result
Ich bin davon ausgegangen, dass zwei nicht direkt aufeinander folgende groß geschriebene Wörter auch berücksichtigt werden sollen, dann halt nicht als Paar...

Code: Alles auswählen

>>> print group_uppers('Ist der Max von Mustermann ein Freund von Clara Schumann?')
[['Max'], ['Mustermann'], ['Freund'], ['Clara', 'Schumann?']]
Wobei die Probleme bei folgendem Satz schon anfangen:

Code: Alles auswählen

print group_uppers('Ist der Max von Mustermann Clara Schumanns Freund?')
[['Max'], ['Mustermann', 'Clara'], ['Schumanns', 'Freund?']]
Weshalb ich den ganzen Ansatz für völlig verkehrt halte.

Ich glaube, ohne ein Wörterbuch, das möglichst alle Vornamen enthält, kommt man nicht wirklich weiter. Selbst dann lässt sich bei 'Das ist das Zimmer vom Nikolaus' kaum zwischen dem Nachnamen 'Zimmer' und dem Substantiv 'Zimmer' unterscheiden.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

@mutetella: Umgekehrt kann's auch passieren wenn Leute Nachnamen haben, die auch als Vornamen gebräuchlich sind. Walter zum Beispiel.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Schon erstaunlich, wie kompliziert selbst so vermeintlich einfaches Zeugs wie deutsche Namensgebung sein kann... :shock:

Hab' mir mal ein paar Gedanken darüber gemacht, wie die Regeln zum Parsen ausschauen könnten:

Code: Alles auswählen

Wort        uppercase Zusatz Unbekannt  $
'Wo'            X
'steckt'                         X
'Karl'          X
'Heinz'         X
'von'                    X
'Hassel'        X
'wundert'                        X
'sich'                           X
'Herr'          X
'Wunder'        X                       X

- Ein uppercase wird entdeckt:
    - Folgewort ist uppercase        -> in queue
               oder Zusatz           -> in queue
    - Folgewort ist Unbekannt 
               oder $ 
                und queue nicht leer -> Namen bilden 
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Und "von und zu" wird noch nicht beachtet :P

Wenn du Namen per Whitelist erkennen willst, dann brauchst du a) eine sehr grosse und b) eine, die komplette Namen enthaelt. Aber da das neue Meldegesetz so ein riesiges Datenschutzloch ist, ist das herankommen ja vielleicht sogar einfach moeglich ...

Und dann gibt es immernoch lustige Randfaelle: "Hat Frank Josef Michael Heinz angerufen?" Na welche kompletten Namen kann man daraus alle bilden?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

cofi hat geschrieben:Und dann gibt es immernoch lustige Randfaelle: "Hat Frank Josef Michael Heinz angerufen?" Na welche kompletten Namen kann man daraus alle bilden?
Einen besonderen Randfall würde ich das noch nicht einmal nennen, mit zwei Namen ist das ja schon nicht mehr eindeutig: "Hat Frank Josef angerufen?" Also: "Hat [Frank] (den) [Josef] angerufen?" oder "Hat [Frank Josef] (dich/hier/heute) angerufen?"
Das Leben ist wie ein Tennisball.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Da die Eindeutigkeit wohl nicht immer gegeben ist, habe ich folgende ultimate Lösung, welche die Prüfung auf alle Sonderfälle erübrigt:

Code: Alles auswählen

def get_uppercases(sentence):
    words = [word for word in sentence.split() if word[0].isupper()]
    random.shuffle(words)
    return zip(words[::2], words[1::2])
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

"Hat Walter von der Vogelweide die Beeren geklaut?" ist halt ohne Zusatzwissen unentscheidbar. Die Möglichkeiten könnte man ja zurückgeben lassen, nur düfte das Regelwerk für die ganzen Sonderfälle ziemlich groß sein.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

@EyDu, das stimmt, ich wollte aber noch den Fall mit Mittelnamen einbringen ... der blieb bisher komplett aussen vor.
Antworten