4 ms·
Ask HN: Best way to implement natural language commands for todo's, reminder etc
I am working on an application that I want to allow users to enter commands in natural language, eg:
Followup in two days
Followup on November 23rd at 3pm
Remind me about my dentist appointment at 3.30pm on December 12th 2008
Clearly there can be lots of subtle variations on what exactly gets entered in these sort of scenarios which makes for a potentially tricky/interesting problem.
Listening to a podcast recently, Joel Spolsky mentioned that people with no knowledge of compilers would tend to tackle a parsing problem like this the 'hard way' (ie using regexes, searching strings etc) while they may be better using a lexer/compiler approach. I have no knowledge of compilers, so my thinking right now is to scan for keywords and then things that look like dates using regexes.
Has anyone implemented anything that does this sort of this command processing and have any tips or tools to share? My application is in Rails, but I am willing to experiment - I just don't want to have many hundreds of lines of code testing for all sorts of strange conditions making for a brittle maintenance nightmare!
- slig 18y agoTry searching for NLP - natural language processing
- astrec 18y agoDateJS (http://www.datejs.com/ http://www.datejs.com/) might have some interesting ideas you can borrow.
- AvengerPenguin 18y agoThe old unix reminder system, "remind", is what I use as the core of my calendar system. It's very good at parsing dates in different formats and is based on text files with lines such as "REM <date string> MSG <text relevant to event>". The reason I like it is the fact systems such as your idea there could possibly be built on top of it. Say you parsed out any portion you saw as a date string and put that at the front, it might be smart enough to handle several date string formats.
- AvengerPenguin 18y ago"Remind" might solve the date side of it, but you'll still need to parse it out. I've thought about a similar thing before and the approach I was looking to take was using something like: http://www.nltk.org/ http://www.nltk.org/ to create grammar trees (read up on how grammars/parsers work at least on Wikipedia) for an acceptable subset of English. You might notice things like a time is always after "at", a date "on" and a relative date "in". Ideas for rules: Event -> Title When Title -> <anything> When -> TimeSpecifier When TimeSpecifier -> "at" Time TimeSpecifier -> "in" RelativeTime TimeSpecifier -> "on" Date ... Then you use semantics stuff to get the parser to return some expression that you can use, say a Python call: event(title=<title>, at=<time>, on=<date>). Just some things to think about and if you don't know grammars, then read up until you understand the example I gave at least. I just wrote it off the top of my head too, so I'm sure someone might find a mistake with it :-) p.s. If you're as weird as me, you might even consider Prolog for parsing ;-)
- markessien 18y agoYou're going up the wrong tree entirely. What you're trying to do is one of the oldest ideas in computing, and it does not work. They keep trying it, and it keeps failing. Not technically, but from a user point of view. Typing stuff out the way you want people to is not easy or convenient, and if there is even the hint of uncertainty, most people will prefer not to do it. Considering that you do not have a background in this, you will lots of unmatched items, and 2/10 fails will consitute too much uncertainty for your users. I have two ideas for alternatives that may or may not work, but at least have not been tried as often: 1. Autocomplete. When the user is typing, autocomplete his message, such that there is always 100% certainty that the command will be executed properly. Also, simplify the syntax, so I write 'remind' : 'December ...' : 'Dentist'. Your syntax has to be consistent, so once learned, there is no relearning. I don't want to have to figure out what the system wants me to type in as a command. 2. Visual. Use blocks and lines to create the actions. Humans have a very good sense of geometry and relationships between physical objects. Leverage that to make your app. Models of physical things are one of the few things we can actually say is inherently intuitive for human beings.
- AvengerPenguin 18y agoDespite all my obvious love for NLP and grammars, I would actually like to echo markessien's point here. I agree that NLP might not be the best approach here, especially if you're having to learn all of it from scratch (I'm no expert but I learnt enough basics so that I could look into any aspect in more depth when it comes to it). My first suggestion would be to take a step back and think about what the system is and what is the easiest, fastest and most intuitive way to input dates. Brainstorm this and you will come up with good ideas like those above. I like the autocomplete idea and also there's no reason not to use some syntax like "Dentist @ 2pm", i.e. using @ to separate title from date. It's sufficient to indicate to the machine which is text and which is date info, but close enough to natural speech as well (also the @ is a very recognisable character now). One thing to note is that Google Calendar accepts expressions such as "Dentist at 2pm"; perhaps you can try that and see how you like how that works?
- fendale 18y agoAuto complete would be a good option, however I want people to be able to send the commands in emails (with the option on the web page too). Having started scanning about NLP, I can tell its a big area, and I don't think I want to invest lots of time into this. Perhaps a cutdown syntax is the way to go. For my small set of commands, all I have now are TODOs, Followups and Reminders. So a few ways of entering each of them and some thinking about dates should get me something usable. That said, I do have concerns about the ambiguity of what can be entered, and what to do with failed commands etc. Dates really are the pain point for entering things - date pickers are generally annoying, and a series of drop downs are a pain too and people write dates in so many different ways!
- olefoo 18y agoThe cheap and cheerful way to cheat this problem is to use a restricted grammar that allows synonyms. And one of the many libraries that wrap strptime for date parsing. In other words; schedule, remind, tell, add; might all represent the same operation. If you go this route, do write a BNF grammar, do test with a reasonably large corpus of 'live' requests. here is a link that should get you started. http://www.antlr.org/wiki/display/ANTLR3/Quick+Starter+on+Parser+Grammars+-+No+Past+Experience+Required http://www.antlr.org/wiki/display/ANTLR3/Quick+Starter+on+Pa...
- fugue88 18y agoIt sounds like you want to rewrite Sandy (http://www.iwantsandy.com/ http://www.iwantsandy.com/), which is good because they're closing down. They show several examples of commands that Sandy accepts. That might help give you a little direction designing your system.
- fendale 18y agoActually I started this before I heard about iwantsandy.com, which I only heard about last week when it was shutting down. At that point I simultaneously thought 'damit, there is a tool to do what I wanted and here is me wasting time writing one to scratch my own itch' and 'interesting, outrage at this shutting down and I am working on something similar'. I have started taking a bit of a different approach to the problem though, in that I want to create a drop box per work area (in my day job, I tend to have many mini-projects to manage at once, each lasting only a month or two) to help me keep track of things without excel. I guess Basecamp or Highrise may get me what I wanted too, but I wanted a small project that is achievable in a reasonable time working 10 hours a week on it, so I am giving it a go!
- ahsonwardak 18y agoWe already do that at ShareMeme - http://sharememe.com/welcome/quickmode http://sharememe.com/welcome/quickmode. You have to a be registered user to use this, and we also offer up the simple forms as well.
- fendale 18y agoI have seen a few places that do these things, but how is the question. Care to elaborate on how you go about it? What tools/libraries you use etc and how successful it has been?
- eru 18y agoI am surprised that Bayesian Reasoning has not yet been suggested.
- drewp 18y agoOne trick for training users on your grammar is to have the program always talk to the user with it. If the program imports my existing calendar and talks about stuff like "lunch with fendale in 3 days" all the time, I'll talk back to the program in similar language. Making users learn syntaxes, especially with any punctuation that you don't pronounce out loud, is lousy. Then, don't be afraid of ambiguity. In many cases, you can Branch Both Ways. 12/10/2008 could refer to two dates, so put the item on both, showing clearly why it's there. "Lunch with Bill" could refer to a few people in my address book, so just link all of them. If your software manages to get some additional data, sort the choices so the likely one is on top.
- fendale 18y agoI like that tip about talking to the user in the language as the APP expects - hadn't though of that myself.
- graham 18y agoparsedatetime (http://code.google.com/p/parsedatetime/ http://code.google.com/p/parsedatetime/) is a fantastic Python library for parsing natural language date / time strings.