Tilde oder Ausrufezeichen für not?

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.
Antworten
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hallo,

ich möchte in einem searchpattern Markierungen setzen, die angeben, ob ein Wort 'oder', 'und' bzw. 'nicht' vorkommen soll.
Jetzt habe ich mir überlegt, dass die Funktion, die searchpatterns zurückgibt, die Wörter unter anderem mit einem vorangestellten '|' und '&' markiert.
Allerdings ist mir der Unterschied der bitweisen Zeichen '~' und '!' nicht wirklich klar. Das Tilde wird für das bitweise NICHT, das Ausrufezeichen für das logische NICHT verwendet.
Wo liegt da der Unterschied und welches der beiden Zeichen wäre denn für meinen Einsatz das korrekte?

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

Das kannst du doch einfach im interpreter ausprobieren:

Code: Alles auswählen

>>> not 10
False
>>> ~10
-11
Fuer deinen Fall ist es also das logische nicht, denn du willst ja nicht das Wort, das aus den Buchstaben besteht, die durch flippen der einzelnen Bits entstehen, sondern das das Wort als ganzes nicht mehr vorkommt.
BlackJack

Wobei das hier eigentlich irrelevant ist, denn weder '!' noch '~' hat eine logische oder bitweise Bedeutung wenn man das nicht definiert. In Python gibt es '!' ja nicht einmal als logisches nicht. Wenn man also nicht daran gebunden ist, eine bestimmte Programmiersprache zu ”simulieren”, kann man jedes Zeichen nehmen und muss es dem Benutzer halt in der Dokumentation erklären. Wenn es um Suchen geht, könnte man genau so gut '-' nehmen, wie das bei vielen Suchmaschinen üblich ist um Worte auszuschliessen.

Falls es nicht unbedingt um die Eingabe von Benutzern geht und Unicode erlaubt ist, würde ich ja '¬' für ”nicht” verwenden. Und '∧' für ”und” und '∨' für ”oder”. :-)
deets

Klar, du kannst das natuerlich voellig frei definieren. Aber ich wuerde schon versuchen, nah an einer allgemein bekannten & aktezptierten Semantik bestimmter Symbole zu bleiben. Die Tilde ist ein als logischer Operator so selten gebrauchtes Ding - wer fiddelt schon mit Bits im Zeitalter von Sets und anderen collections .. ;) - das es den Leuten wenig bekannt ist. Das ! als not aber schon.

Strenggenommen muesste man dann auch bei && und || landen - aber das ist dann wieder ein bisschen uebertrieben finde ich.
lunar

Warum immer irgendwelche Symbole, warum nicht einfach "not"?
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@lunar:
Einzelne Zeichen finde ich einfacher zu extrahieren als Wörter, zudem 'not' und 'or' noch nicht einmal dieselbe Länge haben.

Code: Alles auswählen

if '!foo'[0] == '!':
    #'foo' not in
    pass
if '&foo'[0] == '&':
    #and 'foo' in
    pass
if '|foo'[0] == '|':
    #or 'foo' in
mutetella



Wie lässt sich das kaufmännische '&' innerhalb eines code-tags anzeigen?
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
lunar

@mutetella: Ist nicht Dein Ernst, oder? Immerhin gibt es ".startswith()":

Code: Alles auswählen

if foo.startswith('not '):
    # …
elif foo.startswith('and '):
    # ...
elif foo.startswith('or '):
    # …
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

@lunar Die meisten User sind sich über die Existenz von Operatoren bei Suchmaschinen nicht bewusst, du musst also bei einer Suchfunktion davon ausgehen, dass ein "and", "or" oder "not" wahrscheinlich kein Operator sein soll. Desweiteren ist das Parsen einfacher wenn man Whitespace ignorieren kann.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@lunar:
Ok, würde so auch funktionieren, gefällt mir aber nicht wirklich...

@DasIch:
Die Markierung wird in meinem Fall nicht vom User sondern einer Funktion, die searchpatterns erstellt, an den Suchbegriff vorangestellt.
Ob das nun ein '!' oder ein 'not ' oder sonstwas ist, spielt eigentlich keine Rolle. Aus einem auszuschließenden Suchbegriff 'not a trick' wird demnach ein 'not not a trick' bzw. ein '!not a trick'.

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

@DasIch: Ja und? Die Bedeutung der Wörter bleibt dieselbe. Wer nach „elephants and mice“ sucht, meint Mäuse und Elefanten, also die Konjunktion beider Suchbegriffe. Man kann diese Wörter also getrost als Operatoren betrachten, denn auch in natürlicher Sprache stehen sie für Konjunktion, Disjunktion und Negation.

Leerzeichen kann man so oder so nicht ignorieren, denn "elephantsandmice" ist ganz offensichtlich nicht das, was der Nutzer sucht, wenn er obiges eingibt.

@mutetella: Die Suchterme werden automatisch generiert?! Also dann ist es doch wirklich vollkommen egal, welches Symbol Du für die Negation verwendest.
deets

@lunar

Das ist ja ein bisschen zu kurz gegriffen. Wer nach "elephant or mice" sucht, der sucht wohl eher einen Text, in dem genau diese Phrase (gewichtet uU mit einem Abstandsmass) vorkommt, und nicht alle texte, in dene Elephanten oder Maeuse oder beide vorkommen.

Genau darum wuerde ich Operator-Bezeichnungen, die nicht in derselben Domaene wie die Worte leben bevorzugen.

Und wenn ich zb nach "not not" suchen moechte, und nicht danach, das "not" nicht im text vorkommt, was mache ich dann? Dann kommt man gleich zu escape-mechanismen ala Anfuehrungsstrichen usw... macht das Problem nur komplizierter. Solange natuerlich die Operatoren selbst nicht ebenfalls indiziert werden...
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@lunar:
Ja, ist vollkommen egal. Ich möchte dafür allerdings Zeichen verwenden, die allgemein gebräuchlich sind, so wie z. B. '|' für 'or'.
Bei 'not' war ich mir eben nicht sicher.
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

mutetella hat geschrieben:@lunar:
Ja, ist vollkommen egal. Ich möchte dafür allerdings Zeichen verwenden, die allgemein gebräuchlich sind, so wie z. B. '|' für 'or'.
Bei solchen Fragen solltest du immer an deine Zielgruppe denken, ist z.B für deine Mutter erkennbar, dass `|' ein `oder' ist? Wenn du es nicht nur mit Programmierern von C-Sprachen zu tun hast, solltest du lieber bei lunar's Vorschlag bleiben.
Wenn es noch um dein Kalender-Projekt geht, dann sind die ja auch nicht in der Such-Domäne und erfüllen damit deets (sinnvolle) Anforderung.

@deets: Bleiben wir bei allgemeinen Suchmaschinen-Mustern, dann sind Sonderzeichen für mich durchaus in der Domäne, so sonderbar sie auch sind. Ich Ärger mich jedenfalls immer wenn Google meine Sonderzeichen klangheimlich unterschlägt.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

cofi hat geschrieben:... dann sind die ja auch nicht in der Such-Domäne ...
Dann müsste aber eine intern gesetzte Markierung 'not ' als solche gekennzeichnet werden (z. B. '*not*'), andernfalls würde eine Suche nach 'not a trick' jeden Eintrag, der 'a trick' enthält, ausschließen.
Das spricht doch eher für den Einsatz von Sonderzeichen, oder?

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

Wie schön, dass du die Bedingung abschneidest :P
Aber ich hatte auch einen Denkfehler, selbst wenn es noch um den Kalender geht, will man ja in Beschreibungen o.ä. suchen.

Gegen Sonderzeichen noch ein paar Beispiele:
- Nutzer A will einen Termin/... als wichtig markieren und setzt `!!' an Anfang und Ende, und will sich jetzt alle wichtigen Sachen anzeigen lassen
- Nutzer B will Schätzungen in seinen Texten verwenden und benutzt dafür eine Tilde
- Nutzer C hat einen Termin mit der Firma Müller & Söhne
- Nutzer D baut eine ASCII Tabelle in seine Notizen und benutzt Pipes
- ...

Das Problem hast du bei In-Band-Signaling immer. Nur, wenn du tatsächlich die Begriffe ausschliessen kannst, lässt sich das realisieren. Modifier funktionieren da besser, oder sonstiges was eben nicht Teil des Suchbegriffs ist.
BlackJack

@mutetella: Hm, 'not a trick' schliesst alles mit 'a trick' aus? So spontan hätte ich vermutet, dass die Negation nur das 'a' betrifft. Was die meisten (Volltext)Suchmaschinen als Stoppwort ignorieren würden. Ausser vielleicht wenn man es explizit ausschliesst. Alles nicht so einfach. :-)

@cofi: Nutzer B soll gefälligst '≈' schreiben und D die entsprechenden Rahmenzeichen. ASCII ist sooo altmodisch. ☺
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@BlackJack:
Momentan geht es nur darum, aus einer Reihe von Kategorien ('Schule', 'Privat', 'Kids' ...) eine Auswahl zu treffen. Und mit dieser Auswahl samt 'or'- 'not'- 'and'-Markierungen suche ich dann im category-Attribut, das eine Liste ist.
Eine Volltextsuche ist dafür also nicht notwendig.

Wie eine 'ordentliche' Suche über die Textfelder eines Termins/einer Notiz zu machen ist, das wirft bei mir noch viele Fragezeichen auf.

Ok, mein Beispiel 'not a trick' war doof, weil es mit dem, was ich momentan versuche zu implementieren nichts zu tun hat... :oops:

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