A Configurable GyroQ Tag for Parsing Action Items

Last week's post on "GyroParser-let GyroQ read your mind" demonstrated an initial proof of concept of a GyroQ tag for parsing the text of an action item to try to infer the destination map for it, its due date, its context, and the relationships (e.g. waiting for, owed to, contact about) associated with it. With the new "q" tag in the GyroQ Tag Library, the approach has been made user-configurable; replacing the hard-coded parsing rules with a set of four maps that allow you to customize the language (e.g. "próxima semana" instead of "next week") and rules used. The keyword map used to determine the destination map is also utilized by the new "o" tag for "opening maps, documents, web pages, and applications" using GyroQ

The library also contains a "c" (parse current topics) tag that can be used to marking up one or more selected topics in a map into action items (see example below) rather than text coming into GyroQ.

Before applying "c" tag to topics:
Topics before processing with
After:
Activities after processing with

More information and instructions on the tags and the configuration files can be found on the "MindReader" project page. Your best bet is to follow the instructions in the "Read-Me-First" installation "project map":

MindReader GyroQ Installation Instructions

A big thanks to Curtis B. and Jim H. who tried out some early iterations of the tag.

47 Comments »

  1. ActivityOwner said,

    February 1, 2007 @ 9:16 am

    Note that the set of tags has been renamed to "MindReader". The "om", "aop" and "pct" tags are now "mro", "mrq", and "mrc". These are all available in the GyroQ tag library.

    Instead of downloading the four configuration files, you can run the "mri" GyroQ tag in library to have them created for you.

    Using these tools is finally more of a set of "next actions" rather than a project :-)

  2. Trevor said,

    February 5, 2007 @ 7:12 am

    I tried out mindreader today. Nice work! I've got it fairly customized.

    Here's a question for you, is there a way to give gyroq a task that includes context and resource info.

    For example, if I owe Jen an email about dinner I would say

    Send Jen an email about dinner today

    Send would trigger my e-mail context, today would trigger the date, but I can't seem to trigger the Jen part. I've tried things like

    Send an email to Jen about dinner today and Send an email about dinner to Jen today, but to no avail.

    I'm considering setting up parsings like this, which seem to work:

    Send Jen – jen,%me% – for things I owe Jen with e-mail context
    E-mail Jen – e-mail context, owner is me, no delegation, for things like e-mail

    Hmmm seems like I'll need to develop a tag that will complete a task, but at the same time add a waiting for. For example, e-mail Jen about dinner, creates the waiting for Jen's response regarding dinner.

  3. ActvityOwner said,

    February 5, 2007 @ 7:49 am

    Hi Trevor — As you probably know, Context and Resource assignment are handled separately by the MindReader tags. For the "context", you would just need "Send" and "E-Mail" as topics in the parse-action-verbs map with notes= "e-mail". That makes any task starting with those verbs get the "e-mail" context. The Action verb must be the 1st word in the task to be seen.

    "Resources" are set using the parse-resource-keywordsmap. The resource string can be anywhere in the task. The program finds the first filter topic that matches as task phrase, assigns the associated notes as the resources and exits the resource assignment phase.

    You have four possible "Resource" outcomes to shoot for:

    1. Jen — for things that Jen owes you.
    2. Jen, %me% — for thing you owe Jen.
    3. Jen@ — for things you need to contact Jen about
    4. Jen, %me%, Jen@ — for things you owe Jen and need to contact her about

    I've never actually used #4 in practice, but in theory it is a possible desired combination.

    Here are some possible topic/notes combinations you could use for the above (depending on how you like to phrase things). These can occur anywhere in sentence, but need to be at beginning if you want the verb to trigger a context.

    1. "Waiting for Jen" -> "Jen"
    1. "Jen owes me " -> "Jen"
    2. "I owe Jen" -> "Jen, Trevor" (e.g. "Draft report that I owe Jen.")
    2. "Jen is waiting for" -> "Jen, Trevor" (e.g. "Draft report that Jen is waiting for")
    3. "Contact Jen" -> "Jen@"
    3. "Email Jen about" ->"Jen@"
    3. "Send Jen" -> "Jen@"
    4. "Respond to Jen" -> "Jen, Trevor, Jen@ "

    Does that work for you?

  4. Trevor said,

    February 5, 2007 @ 2:07 pm

    Thanks that's definitely helpful. I do see a few times when you might need #4. Opens up some possibilities. I'll try out a few more things and get back to you with how it works out.

    Thanks again

  5. ActivityOwner said,

    February 7, 2007 @ 10:30 pm

    Note that items 2 and 4 (owed to Jen) will show up as "owed to you" as well. That is because they are sitting in an In-tray of a "project" you own (or that is unassigned but defaults to %me% ownership). This causes the tasks to be seen by ResultsManager as items Jen is responsible for to you, but that have been delegated to someone else, who also happens to be you.

    The trick to avoid that would be to set up a dedicated map for "I owe Jen" items. That could be done by adding keywords to the resource map for "I owe Jen" , "Respond to Jen" (or just "Jen") that direct the action item to the "Jen" map.

  6. Sergei said,

    February 9, 2007 @ 4:44 am

    i did what mindreader instruction map told me to do to install all tags. when using mrq tag some actions do get recognized by context (e.g. 'go to the store' was not recognized as 'errand'), BUT the problem is, after clicking 'send', they all get on my daily capture map in 'action due today' branch (although with correct due dates). did i do anything wrong? thx

  7. ActivityOwner said,

    February 9, 2007 @ 7:08 am

    Hi Sergei — Thanks for trying the program. For the "context" example you provided, you would have to have "go to the store" in your parse-verb-keywords.mmap as a topic with "errand" as the note in order for it to be recognized. The action also needs to lead with the "verb" phrase. The default may recognizes anything that starts with "buy" as an errand (e.g. just say "buy eggs" rather than "go to the store to buy eggs".

    If you want the task to go to something other than your daily capture map, you need to define keywords/map-links in parse-map-keywords that direct the task elsewhere.

    In actually placing the task on a map, the mrq tag looks for an existing "In-tray" branch in the map, or creates one if needed. It sounds like "actions due today" branch might be an in-tray (category:In-tray*;process).

    Let me know If I can provide more information.

  8. ActivityOwner said,

    February 9, 2007 @ 11:02 pm

    Note that MindReader has be upgraded and simplified. It now uses a single mindreader.mmap configuration file in the default MindManager directory. The configuration file can be downloaded from a link on the installation map. If you have previously customized your keyword maps, contact me for an upgrade script or start fresh. This version also allows customized addition of icons based on keywords as well as removal of any keywords within [brackets].

  9. Ron said,

    February 28, 2007 @ 6:08 pm

    I just installed MR and am testing it out following the steps in the MindReader-Read-Me-First map. The "o" tag is behaving oddly. The map I am targeting to open does in fact open, but then it closes immediately and I am moved to my Daily Actions map. Any ideas on what is going on?

  10. ActivityOwner said,

    February 28, 2007 @ 7:17 pm

    Hi Ron — Are you sure the target map is actually opening?

    The first thing "o" tag does is create a temporary map and put the input text in the central topic. The mindreaderOpen.mmbas macro then copies that text and closes the temp map. It uses thr text to search the "links" keywords branch of the mindmanager.mmap configuration file for the map to open. If it doesn't find a match, it opens the first one (the daily capture map).

    Perhaps you are you are seeing the temp map flash up and think it is your target map?

    Looking at the documentation, I realize that it doesn't tell you to go into the mindreader.mmap file and add subtopics under the "links" branch with the keyword/hyperlink for the maps you want to open.

    Try typing "o mrsample" to open the sample map. You can jump to the configuration file by typing "o mapmap".

    Let me know if the above helps.

  11. Ron said,

    March 2, 2007 @ 6:00 pm

    Yep – that did it – thanks. I love this idea and am finally starting to get some real use from GyroQ.

  12. ActivityOwner said,

    March 2, 2007 @ 6:45 pm

    Great — FYI — The "mra" tag has been updated to include the ability to add links to maps and their associated keywords. It also allows additional verb/contexts and contacts to be added. You can run it anytime to upgrade your current configuration with new information.

    The "mri" tag used for the initial configuration has also been upgraded to add links/keywords for target maps.

  13. Hans said,

    March 10, 2007 @ 8:58 am

    Inspired by http://www.43folders.com/2006/11/14/project-versus-next-action/ I've updated the MindReaderNLP.mmbas and the mindreader.mmap to identify unclear actions.

    For the mindreader.mmap
    – I've added additional contexts, without notes for those action verbs I don't have a specific category for but know are actions
    – I've added a verb-result branch, containing project/subproject/result verbs

    For the macro:
    – if the first word of the line is not in the context or verb-result branch, mark it with a grey blob (marker7)
    – if the first word of the line is in the verb-result branch, mark it a result/subproject

  14. ActivityOwner said,

    March 10, 2007 @ 9:50 am

    Good work Hans! I knew MIndReader would hook some more programmers eventually :-). Curtis has been the main tinkerer so far.

    The first version of MindReader had code that looked for the GTD "Project Verbs" (and marked them as such) but I took it out as the early feedback was that it was a little confusing.

    Folding it back in is straightforward, although some words overlap between the action and project list (I guess we let action win). One thing to watch out for is that a "result" won't hit your next-action list, so you want to be on top of your "My Committed projects needing next actions" list. You also want to avoid assigning "blob" to items that triggered "contact" or "waiting for" resource keywords. I think it is OK to take the pressure off of "someday" items as well.

    Implementing the "blob" icon code concisely if you allow for non-context verbs is a little more challenging. I love the fact that this can all be done with 44 lines of code, so the challenge is to avoid bloat while adding blob :-). Could you live with assigning "anywhere" for those verbs rather than leaving them blank? If so, the "blob" icon can be added after the maintopic (end if/Next/Next) loop with these lines:[edit]

    resulticon =Utilities.GetCustomIconSignature("C:\Program Files\Gyronix\GyroQ\resultmanager-resulticon.ico")
    projecticon=Utilities.GetCustomIconSignature("C:\Program Files\Gyronix\GyroQ\resultmanager-projecticon.ico")
    somedayicon=48

    If Not InStr(cat,"@") _
    And atopic.Task.Resources="" _
    And Not atopic.Icons.ContainsCustomIcon(resulticon) _
    And Not atopic.Icons.ContainsCustomIcon(projecticon) _
    And Not atopic.Icons.ContainsStockIcon(somedayicon) Then atopic.Icons.AddStockIcon(mmStockIconMarker7)

    I've uploaded revised version to
    http://www.activityowner.com/maps/ao-parse/download.php?mapname=mindreader.zip

    For now users need to manually add a "results" branch with subtopic "project verbs" to mindreader.mmap if they want to use them. 43 folders list the "Weak Project Verbs" as "finalize, look into, organize, ensure, install, resolve, submit, design, rollout, handle, maximize, complete, update, and setup".

  15. Hans said,

    March 10, 2007 @ 7:54 pm

    Hi,

    yes, indeed it should mark less items as 'blob'.
    However, I rather not assign some actions to a specific context such as anywhere, but would rather let them inherit from a parent topic.

    I would say:
    – set a 'blob' flag to true after 'For Each atopic In itopics'
    – if we find a match in the context set the blob flag to false

    If Not Blob or (Not InStr(cat,"@") _
    And atopic.Task.Resources="" _
    And Not atopic.Icons.ContainsCustomIcon(resulticon) _
    And Not atopic.Icons.ContainsCustomIcon(projecticon) _
    And Not atopic.Icons.ContainsStockIcon(somedayicon)) Then atopic.Icons.AddStockIcon(mmStockIconMarker7)

    or something like it…

  16. ActivityOwner said,

    March 10, 2007 @ 11:24 pm

    Actually now that I think about it, given that the code appends "@" to the cat string (even for a blank context) it should work fine without an "@anywhere. If we were assigning the context directly to the context field, we'd need to take the approach of setting the blog flag to false.

  17. Hans said,

    March 11, 2007 @ 3:10 am

    I don't yet fully agree regarding the resources check – want to dig deeper in this.

    Anyway, the blob check should be;
    If Not (InStr(cat,"@")>0 _
    Or atopic.Icons.ContainsCustomIcon(resulticon) _
    Or atopic.Icons.ContainsCustomIcon(projecticon) _
    Or atopic.Icons.ContainsStockIcon(somedayicon) ) Then atopic.Icons.AddStockIcon(mmStockIconMarker7)

    as the original would even 'blob' the 'email myself' action.

  18. Hans said,

    March 11, 2007 @ 3:54 am

    About the resources… What was nagging me is that the current resources are aimed at personal project maps and no so much as for a team.
    For the latter, the actions/blobs would be formulated as:
    – X waiting for Y …
    – X waiting for Y to …
    – Y for X to …
    – X to …
    – X …
    – X: …

    and '…' being things like 'email John' etc.
    Just trying to think how to capture this in the code without bloating it. I would also rather have just a list with the resources names (X, Y) and some additional verbs instad of one big list with all the possible combinations

  19. ActivityOwner said,

    March 11, 2007 @ 8:30 am

    OK — I think I see what you mean. From a "me" point of view,, if MindReader parses a task and ends up with Resources

    X (waiting for X)
    X@ (contact X)
    me,X@ (X owes me)

    then it is usually not "blob" for "me", so I don't want a blob the task if resources<>"". It could be a "blob" for X, but that's X's problem :-). The exception would be an "I owe".

    You are suggesting coding it so that you could have a project map up on a screen in a team meeting, and have MindReader process the accumulated topics into "Action Items" for the team members, and have it blob unclear tasks. You also want it to be able to assign resources effectively.

    This can work today if you are the project manager or always X or Y, but not if you are "Z". "Generic name extraction" has been on the "project map" for awhile as a "blob". The 1st road block I ran into was deciding whether resource names should be 1 or 2 words. I always used one word (with 1st initial when needed), but Gyronix recommends full names to allow for future growth (e.g you suddenly have two JSmith's). If we can agree to run with single-word-name (which allows John.Smith) , we can have a go at it.

    Rather than English-centric hard-coding, the generic way to do this would be to use an "eval" approach similar to what is done with dates, say on a main branch called "resources2", to be run before or after the dedicated resources branch.

    if bStr="resources2" then atopic.Task.Resources=eval(mStr)

    with the "notes" on each keyword subtopic containing the code to be used for that keyword. For example to handle Waiting for X
    Y waiting for X
    Contact X
    Y contact X

    The map and code could look something like:
    topic-text:"Waiting for"
    note:
    if instr(lStr,keyword)=1 then
    resource = [next word after keyword]
    else
    resource = [word before keyword, word after keyword]

    topic text: "Contact"
    if instr(lStr,keyword)=1 then
    resource=[next word after keyword]@
    else
    resource=[word before keyword, word after keyword@]

    The issue that comes up next is how we leverage the 1st word in the task. Right now "verbs" are required to be the 1st word. That is intended to avoid false-context assignments on a sentence like "pick up the draft email from printer" (is it pick up, draft, or email?).

    The ideal code would be smart enough to parse "Waiting for John to draft the report" or "Joe waiting for John to pick up the draft report".

    Note that you can currently use the [] to clip out words that are in the task just for parsing — e..g "pick up draft report [Joe waiting for John]" becomes "Pick up draft report", R=John.

    Perhaps we could use the "[" as a 2nd "beginning of sentence" from a resource parsing point of view?

  20. Hans said,

    March 11, 2007 @ 7:02 pm

    I can see you your point for the [Me | I] waiting for as not to be marked as 'blob'. But if you put it in the context '@waiting for' it has a context and thus is un-blobbed.

    > You are suggesting coding it so that you could have a project map up on a screen in a team meeting, and have MindReader process the accumulated topics into "Action Items" for the team members, and have it blob unclear tasks. You also want it to be able to assign resources effectively.

    Yep, and not only during a team meeting. Also for project admin outside the meeting, eg in the case where only I manage the map for the project.

    > This can work today if you are the project manager or always X or Y, but not if you are "Z".
    Why not? Should be doable. Sure, in the inbox I could be the ActivityProvider but when put in the proper place in the project map combined with inheritance.

    > If we can agree to run with single-word-name (which allows John.Smith) , we can have a go at it.

    Fine by me. Currently I work a lot with network aliasses.
    But it could even be a list in the project map or mindreader config map.

    > The issue that comes up next is how we leverage the 1st word in the task. Right now "verbs" are required to be the 1st word.
    > The ideal code would be smart enough to parse "Waiting for John to draft the report" or "Joe waiting for John to pick up the draft report".

    First example would be parsed by the current, "ego-centric" mode.

    Second, I think we want this to be parsed as:
    context: @errand – based on pick up
    owner: Joe, John

    Somehow we should be able to lift the "Joe waiting for John to" out of the original sentence, so it could be parsed as normal for the 1st verb.

    So the first part is:

    If we can recognise this, we should be able to track the 1st word after it, which should be a verb.

    positionFirstVerb = -1 ' not found yet
    If bStr="contexts" Then
    posVerb = InStr(lStr,keyword)
    If posVerb=1 Then
    cat=cat&",@"&mStr
    Else
    If positionFirstVerb = -1 Then
    positionFirstVerb = posVerb
    else
    if posVerb Perhaps we could use the "[" as a 2nd "beginning of sentence" from a resource parsing point of view?
    Rather not, unless it will stay there.

  21. Hans said,

    March 11, 2007 @ 7:12 pm

    Oh, and to prevent just a @ as category, add:
    cat=Replace(cat,"@,","")
    if cat=",@" then cat = ""

    just before:
    atopic.Task.Categories=cat

  22. ActivityOwner said,

    March 11, 2007 @ 7:59 pm

    Good suggestions Hans — I think I'll need to process them onto the "project" map to organize it all — Luckily I have the new mindmanager-rss-reader just in time :-)

    For firstverb, the code needs to do some type of "first" check (if posVerb

  23. Hans said,

    March 11, 2007 @ 8:04 pm

    And to supplement mindreader, I've created the 'to' tag, which will move the selected topics to the in-tray of the map with the given keyword:
    {send;
    run:macro:'activedocument.selection.cut';
    map:new;
    select:central;text:'_queueitem_';notes:'2';
    run:macro:'MindReaderOpen.mmbas';
    }

    In MindReaderOpen.mmbas;
    add=(ActiveDocument.CentralTopic.Notes.Text="1")
    add2=(ActiveDocument.CentralTopic.Notes.Text="2")

    If add or add2 Then
    For Each mtopic In ActiveDocument.CentralTopic.AllSubTopics
    If mtopic.TextLabels.ContainsTextLabel("In-tray*") Then
    Set itopic=mtopic
    found=true
    End If
    Next
    If Not found Then Set itopic = ActiveDocument.CentralTopic.AddSubTopic("In-Tray")
    itopic.Task.Categories="In-tray*,process"
    if add then
    Set ntopic=itopic.AddSubTopic(aStr)
    ActiveDocument.Selection.Set(ntopic)
    end if
    if add2 then
    ActiveDocument.Selection.Set(itopic)
    ActiveDocument.Selection.Paste
    end if
    End If

  24. ActivityOwner said,

    March 11, 2007 @ 9:22 pm

    OK — This string of string functions below will extract the Resource following a resource-oriented keyword:

    Mid(LTrim(Mid(aStr,InStr(LCase(aStr),LCase(keyword))+Len(keyword))),1,InStr(LTrim(Mid(aStr,InStr(LCase(aStr),LCase(keyword))+Len(keyword)))," "))

    This can replace named-resource currently used. Let's assume it goes into a "resource" maintopic instead of "resources" to avoid backward compatibility issues.

    The function can either go into the note (using the approach used for dates) or can be triggered by a code in the note (using the approach used for "link" and "note"). Using the code in note enables the subtopic keyword itself to be language-independent. In this case I think the note=code is cleaner.

    I think "owed to" is often going to be captured by inheritance with the exception of odd personal bits-and-pieces tasks, so doesn't need to be done generically for full X, Y, Z scenarios.
    [edit:forgot the rtrim]

    If bStr="resource" And mStr="waiting for" Then atopic.Task.Resources =RTrim(Mid(LTrim(Mid(aStr,InStr(LCase(aStr),LCase(keyword))+Len(keyword))),1,InStr(LTrim(Mid(aStr,InStr(LCase(aStr),LCase(keyword))+Len(keyword)))," ")))
    If bStr="resource" And mStr="contact" Then atopic.Task.Resources =RTrim(Mid(LTrim(Mid(aStr,InStr(LCase(aStr),LCase(keyword))+Len(keyword))),1,InStr(LTrim(Mid(aStr,InStr(LCase(aStr),LCase(keyword))+Len(keyword)))," ")))&"@"
    If bStr="resource" And mStr="I owe" Then atopic.Task.Resources =RTrim(Mid(LTrim(Mid(aStr,InStr(LCase(aStr),LCase(keyword))+Len(keyword))),1,InStr(LTrim(Mid(aStr,InStr(LCase(aStr),LCase(keyword))+Len(keyword)))," ")))&"%me%"

  25. ActivityOwner said,

    March 11, 2007 @ 10:06 pm

    OK — I've updated MindReaderNLP.mmbas and mindreader.zip to include the code for generic resource parsing. I left in the existing "resources" functionality, as it can be a nice way to "soften" the text for frequent contacts (e.g. "Talk to John about" -> R:Smith rather than "Talk to Smith about"). The "last" main branch wins, so existing users need to drag the "resource" branch counter-clockwise to come before "resources" so it is not overridden by "resource".

    I updated the "mra" tag so that it adds a "resource" main topic and the needed subtopics if they don't exist to mindreader.mmap. Existing users can add this tag to add the functionality. New users need to run "mra" to add the functionality at this point as well.

    "!st verb" updates will need to wait until next weekend :-).

    As usual, the quality control department is off for the weekend, so buyer beware…

  26. ActivityOwner said,

    March 13, 2007 @ 10:06 pm

    My initial experience with the generic resource extraction is that it isn't ready for prime time. While it is neat when it works, it introduces more false positives than I expected. For example "waiting for Hans to return call about project" gets assigned a resource of "about" because it thinks the "call" is a "call X" phrase. The extraction code also needs to be updated to handle resource word ending with ] or end of sentence.

    There are a couple of options to deal with false positives:
    1. Limit this feature to the 1st position in string where it is likely to be correct
    2. Screen the identified resource against a configured list or _rm_owners_

    For now I'm going to take the configuration code out of "mra" so it doesn't adversely impact users, but include below for reference:

    {select:main;
    select:text:'resource';
    create:main:'resource';
    select:subtopic;
    select:text:'waiting for';
    create:subtopic:'waiting for';
    notes:'waiting for';

    select:parenttopic;
    select:subtopic;
    select:text:'i owe';
    create:subtopic:'i owe';
    notes:'i owe';

    select:parenttopic;
    select:subtopic;
    select:text:'e-mail';
    create:subtopic:'e-mail';
    notes:'contact';

    select:parenttopic;
    select:subtopic;
    select:text:'email';
    create:subtopic:'email';
    notes:'contact';

    select:parenttopic;
    select:subtopic;
    select:text:'contact';
    create:subtopic:'contact';
    notes:'contact';

    select:parenttopic;
    select:subtopic;
    select:text:'call';
    create:subtopic:'call';
    notes:'contact';

    select:parenttopic;
    select:subtopic;
    select:text:'talk to';
    create:subtopic:'talk to';
    notes:'contact';}

  27. Synesthesia said,

    March 26, 2007 @ 8:08 am

    Getting Things Done with Mindmanager, ResultsManager, GyroQ, and now MindReader…

    I’ve used Mindmanager as my core information-management tool at work for several years. For the last few months I have also been using it as the underlying support for my “GTD-like” personal productivity processes, augmented with the excellent Re…

  28. Noam said,

    May 15, 2007 @ 11:21 am

    I am unable to succesfully run mri and install my initial map. I am running the most current versions of Mindmanager, Resultsmanager, and Gyro. When I try to run the mri that is intalled by the mindreader combined back, I get an error box that comes up. When I try to run the mri that is listed separately as it's own installable tag, I get a dialog box that says it is going to create a document with an OK button, but after I click on OK, nothing happens. I have, of course, rebooted many times. Any suggestions?

  29. ActivityOwner said,

    May 15, 2007 @ 12:44 pm

    What is the error message that you get in the 1st case? The mri script is in GyroActivator code so it is harder to error-trap. We could try putting in some message boxes to see how far it is getting.

    In the meantime, you can download a basic mindreader.mmap file to put in your "my maps" directory from here:

    http://wiki.activityowner.com/index.php?title=MindReader_Configuration_Map

    This should allow you to get started using the tags. The mri tag is just a way of automatically configuring this file to your liking. You can augment the basic mindreader.mmap file using the "mra" tag.

  30. Roelof Timmer said,

    May 22, 2007 @ 1:47 pm

    I had exactly the same problem as was reported in the discussion section of your wiki. I could have written it word for word:

    "Having some trouble… I'm running MindManager 6.2.399 and GyroQ 1.9.2
    I've added the packed text for the MindReader "o","q","c","mri", "mra", and "s" Tags into GyroQ dialog box. (success) I've downloaded the two macros into my My Maps folder. When I run mri, it tells me that it's going to create the mri map, goes to MindManager to do so, then creates the central topic, but then stops and throws an error: "Object 'CmjDocumentCollectionComObject' reports an error: 'unable to create document'. Then the central topic gets wiped out and I don't have a mindreader.mmap file anywhere. I have no idea where to start to try to debug this…

    The GyroQ taskbar had somehow died. So when I restarted it and enabled extended tabs it all started to work. I think I'm set now."

  31. ActivityOwner said,

    May 22, 2007 @ 6:26 pm

    The wiki has a discussion section? I'm only half kidding — I hope I saw it there at the time.

    So what was your experience exactly? You were getting the comobject error, but then restarting, and subsequently mri and everything else worked? I don't recommend 1.9.2 as the packed text for these

    GyroQ doesn't have the ability to error trap the way macro code does, so it is hard to track down the cause of this error. I've seen it reported a few times. What I usually recommend to folks is to download the sample mindreader.mmap and configure that. The solution would be to someday/maybe rewrite mri in macro code.

    Looks like this should go to the top of the FAQ list:

    http://wiki.activityowner.com/index.php?title=MindReader_FAQ

  32. Noam said,

    June 1, 2007 @ 5:46 pm

    After restarting, I found that everything worked the next time I ran it. Great for me, I guess not so good for testing purposes for everyone else. Oh well.

    Another question, though. After configuring the mindreader.mmap file with a bunch of my maps and then using the q tag to enter a whole bunch of stuff, although everything worked and was placed into the correct map on a "send queue", they key word I set up for each map was included (I assume by design) in each activity description. I assumed it wouldn't work that way, and unless I'm missing something, this doesn't really seem to make sense to me.

    For example, an entry in GyroQ might be "ibmarket send email to John doe next week re basketball game", where ibmarket is the keyword for an Investment Bankers Marketing Plan Map. The entry is sent to the correct map and parsed perfectly, except the entry starts with "ibmarket". I would have thought that map keyword itself would not be included in the activity description. I can't really come up with any keyword descriptions for my maps that I would consistently want included in all activities sent to the maps.

    Thoughts?

  33. ActivityOwner said,

    June 1, 2007 @ 8:38 pm

    If the restart works, then great — we'll put it in the FAQ. Its likely a GyroQ bug that will shake out as the product matures.

    In terms of your second question, there is a key syntax trick you need to incorporate. Any text inside of [brackets] is removed from from the final activity text. This gives you the option of having it included if desired. For example, instead of

    "ibmmarket send email to john doe next week re basketball game"

    you could say

    email John Doe re:basketball game [ibmmarket next week!]

  34. Noam said,

    June 3, 2007 @ 12:30 am

    Perfect! I never picked up that bracket syntax anywhere, or perhaps I jumped in before reading everything there is to read. Thanks for responding so quickly with the answer. Mindreader is truly fantastic.

  35. ActivityOwner said,

    June 3, 2007 @ 7:16 am

    I understand. The documentation is pretty lean and spread across several posts and wiki pages.

    This is only covered in the demo video, which exercises most of the syntax features

    http://www.activityowner.com/2007/02/24/gyroq-mindreader-video-clip/

    and on the "syntax" map

    http://wiki.activityowner.com/index.php?title=MindReader_Syntax

    I am finding that even heavy users are missing some of the major "features". I am hoping the wiki provides a framework to improve on that situation.

  36. Noam said,

    June 7, 2007 @ 12:19 pm

    Any update on compatibility with version 7 of Mindmanager? I'm seriously not considering the upgrade because I don't want to lose my q tag utility.

  37. ActivityOwner said,

    June 7, 2007 @ 7:25 pm

    MindReader is working fine with MindManager 7 now. See:

    http://www.activityowner.com/2007/05/26/mindreader-7/

  38. Jose Miguel Bolivar said,

    September 3, 2007 @ 1:47 pm

    Hi again AO!

    My "resources" topic within Mindreader.mmap is growing fast and it is difficult to manage already.

    I have added many verbs for my main contact people (e.g. Ask X, Talk to X about, Update X on, Discuss with X, Call X, E-mail X, Remind X about, Inform X about and so on). It is really a huge time saving as I can use "natural" expressions for my actions.

    However I have realized that most of these "extra" verbs actually point to the same "X@" result, so I have thought about updating the MindReaderNLP to be "smarter" and allow having a "lighter" resources topic in MR.

    What I have in mind is something like:

    If X identified as Resource look for one of the following additional expressions:
    If is one of these {call,update,talk to,remind..} Then Owner=X@
    If is "waiting for" Then Owner=X
    If is "I owe" Then Owner=X;%me%

    Does it make sense?

    I would apply the same approach for the Icons, as I use the same one for several verbs and the list is also growing fast.

    Unfortunatelly my programming knowledge is quite limited so any suggestions about how to implement this will be greatly appreciated.

    Thanks in advance.

    José Miguel

  39. ActivityOwner said,

    September 3, 2007 @ 3:02 pm

    Hi José Miguel — I know exactly what you mean. I went down this path early on, hit some road blocks, and tossed the feature onto my "someday/maybe" list. I think the problem was that I was too ambitious and wanted to automatically identify resources that I hadn't previously enumerated.

    The problem I ran into was deciding if the resource should be one or two words (e.g. "John" or "John Smith"). This impacts whether your search for 1st or 2nd space to terminate the resource string. Gyronix recommends full names, but I've always just used last or first.

    We could get around this issue by searching a pre-defined set of resource strings (and sacrifice the ability to "discover" new resources):

    If instr(teststr,"Contact") then
    for each resource in resources 'need to line this up with right topic list
    if instr(Replace(teststr,"Contact ","")), resource)=1 then
    cat=cat & resource & "@,"
    end if
    next
    end if

    The resource needs to immediately follow the "leading verb" string or else you can get confusion when multiple resources are mentioned in a task. Maybe this is what threw me off last time.

    The code above seems like it will work. I'm not sure why I didn't do that the first time around. One of the appeals of MindReader is does its job in only 100 lines of code and has good language independence.

    Have you been using "mra" to add resources? I just run mra, cancel past the file and verb prompts and then enter the resource keyword and keyword and it builds all the required strings. I don't manually go into mindreader.mmap much at all, so that reduced the driver to improve things.

    I'll take a shot at integrated the code above, but it might be a few weeks if I don't get to it today. Today's "weekly" review show me a pretty hot and aging dashboard!

  40. ActivityOwner said,

    September 3, 2007 @ 6:00 pm

    OK — this proved more interesting than emptying my home "in-tray". Revised code has been uploaded.

    The first time the code is run it will create new "resourcelist" and "resourceverb" branches in mindreader.mmap. The "resourceverb" branch is populated with the typical items (contact, waiting for, etc). The notes communicate the type of relationship indicated (partner, waiting, owe).

    The "resourcelist" branch is populated with three samples that you can build on.

  41. ActivityOwner said,

    September 3, 2007 @ 9:42 pm

    The "mra" tag has been updated to prompt user for entries in the resourcelist. Just cancel past the link and verb prompts.

    Once this is populated, the "resources" branch can be removed or trimmed down to shorthand keyword@ = resource@ entries (e.g. John@ = "John Smith@").

  42. ActivityOwner said,

    September 3, 2007 @ 11:43 pm

    Two more revisions — I fixed a significant but introduced by the functionalization of the code.

    I also added the fabled "generic resource" recognition. Now "Talk to John Smith" will lead to "John@" if John Smith isn't in the resourcelist and "Waiting for Amazon" will lead to resource=Amazon.

    This should enable MindReader to be more useful to folks right out of the box without any customization. I also added your additional "contact" verbs (e.g. inform) to the default set as they are nice additions.

    Thanks for the nudge to get this off the someday/maybe list!

  43. Jose Miguel Bolivar said,

    September 4, 2007 @ 8:55 am

    Hi AO,

    Great work! It is exactly what I unsuccessfully tried to get by my own. I specially like that you can enter resource names that are not pre-defined.

    I have taken the freedom to add one line of code to the FirstWord function to convert the name of the resource to capital letters as "dad" seemed a bit ugly to me :-) :

    FirstWord=UCase(Left(FirstWord,1)) & LCase(Mid(FirstWord, 2))

    I also omitted the "starting" part of the code as I am using a customized version of both mindreader.mmap and mindreadernlp.mmbas. I did so because I wanted to deal with dates in multiple ways, e.g. setting deadline and leadtime.

    Now they are able to deal with complex date expressions like "from Monday for three weeks", "in ten days same day" or "by end of week after next for three days".

    You can also use either ·09/04· for starting date or #09/04# for due date (· is Shift+3 and # is AltGr+3 in the Spanish keyboard).

    If you are interested in having a look at those modified versions just let me know the email address I should send them to and I will do it.

    I have also modified the "mark task complete and log" with additional date functions I needed, e.g. "FirstWeekOfMonth". I can send it yo you as well if you wish.

    Thanks again.

  44. Jose Miguel Bolivar said,

    September 4, 2007 @ 1:35 pm

    Hi AO,

    I ahve to admint I feel a bit guilty that you are not dealing with your home intray properly but I have just noticed that the new code works great unless the verb is between [] and I am not able to fix it myself.

    What happens is that expressions like "I owe Peter some money" correctly lead to: "R: Peter, %me%", while "[I owe Peter] some money" lead to: "R: , %me%".

    I have also tried "Some money[I owe Peter]" with the same result.

    Would it be possible to call the funtion RemoveBracketedText before calling the mindreadtopic one whitout losing content?

    Any other idea?

    Thanks again.

  45. ActivityOwner said,

    September 4, 2007 @ 7:30 pm

    Great points — you are quite the power user!

    I incoporated you upper case fix. I had noticed this as well but found that ResultsManager dealt with it OK so hadn't fixed it yet. I was trying to decide whether to just pass around the string in normal form or add a parameter to the function. This will work fine for now.

    I fixed the 2nd bug related to brackets. The problem was that it was doing the assignment even if it didn't find a "1st word" resourceverb match (hence the blank entry).

    It was set up to only do automatic resource extraction if the resourceverb is at the beginning of the sentence. The risk of false positives is too high if it looks for them throughout the string.

    For example:
    "Buy contact lenses" -> R="Lenses@"
    "Return phone call" -> R=""
    "Empty email box" -> R="Box@"
    "Arrange discussion of project" -> R="Arrange@"

    In order to enable the approach you in your examples, I changed the code so that will also do the generic match if the resourceverb falls right after a bracket:

    "Return phone call [Call John]" -> R="John@"

    I folded in the additional date delimiter you provided along with fixes above and uploaded to the wiki.

    Your date syntax is pretty advanced and might be hard to fold into the current approach. Currently "Monday" leads to a due date of Monday. In your example "from Monday" is a start date right?

    We could define a additional "AbsoluteStarting" branch that would set "from Monday" as a start date, but we'd need to have code be smart enough to not see the "Monday" portion of the string as a due date. Let's continue to discuss.

    "Mark Task Complete" needs an overall and better syntax definition. Lets move on to that once MindReader stabilizes a bit.

    Thanks for the interest and input. Have you used MindReader in Spanish at all?

  46. Jose Miguel Bolivar said,

    September 5, 2007 @ 7:16 am

    Thank you for fixing the code!

    I have added a couple of lines more as the function was not yet properly processing defined resources if between brackets, e.g. it worked well for "Call John" -> "R: John Smith@" but not for "[Call John]"-> "R: John@".

    The code is the following (for sure there is a be a better way to do it):

    Case "resourceverbs"
    remaining=Replace(LcaseActiveTopicText,LCase(KeywordTopic.Text) & " ","")
    -> If matchbracket Then
    -> remaining=Replace(remaining,"[","")
    -> remaining=Replace(remaining,"]","")
    -> End If
    found=False

    Regarding the date syntax, I have found the issue you mention with cases like "Monday". Maybe the workaround I am using results in a bit artificial English expressions, but it works.

    I have three main topics about dates in mindreader.mmap: starting, duedates and leadtime

    Expressions in "starting" always start with either "from" or "in", e.g. from Monday, in two weeks

    Expressions in "duedates" always start with "by", e.g. by Monday, by end of week

    Expressions in "leadtime" always start with "for", e.g. for two days, for three weeks

    The changes I had to made to the code in mindreadernlp were minimum.

    As for your other questions, I normally work on my corporate laptop, where everything including the OS in is English, so I got used to write in English all the time. It helps me improve my English skills and also to think faster in English.

    Anyway, if there is something I can do, like translating some code or whatever else, I will be happy to help.

    Regards.

  47. ActivityOwner said,

    September 5, 2007 @ 7:15 pm

    Download the latest code and see if you still have the problem you describe. I put up a few versions yesterday and you might have grabbed it before I fixed all the issues.

    Jose Miguel and I discussed the date syntax offline a bit. We'll need to find a way to fold in some of his ideas without breaking the basic functionality (e.g. ambiguity of "from Monday" being interpreted as Duedate = Monday.

RSS feed for comments on this post · TrackBack URI

Leave a Comment

Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 2.5 License.