<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ian Mercer &#187; NLP</title>
	<atom:link href="http://blog.abodit.com/tag/nlp/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.abodit.com</link>
	<description>Living in the World&#039;s Smartest House</description>
	<lastBuildDate>Sat, 07 Jan 2012 19:50:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Integrating Wordnet with Natural Language Processing (NLP)</title>
		<link>http://blog.abodit.com/2011/11/integrating-wordnet-with-natural-language-processing-nlp/</link>
		<comments>http://blog.abodit.com/2011/11/integrating-wordnet-with-natural-language-processing-nlp/#comments</comments>
		<pubDate>Sat, 26 Nov 2011 23:03:12 +0000</pubDate>
		<dc:creator>Ian Mercer</dc:creator>
				<category><![CDATA[Natural Language Processing]]></category>
		<category><![CDATA[Semantic Web]]></category>
		<category><![CDATA[NLP]]></category>
		<category><![CDATA[Wordnet]]></category>

		<guid isPermaLink="false">http://blog.abodit.com/?p=1650</guid>
		<description><![CDATA[I&#8217;ve been working to get a release of my NLP Engine out the door but wanted to boost the built in dictionary / thesaurus before release. So this weekend I integrated Wordnet into the engine. Wordnet is available in RDF as a series of triples. As well as all the word definitions grouped into synonym <a href="http://blog.abodit.com/2011/11/integrating-wordnet-with-natural-language-processing-nlp/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been working to get a release of my NLP Engine out the door but wanted to boost the built in dictionary / thesaurus before release.  So this weekend I integrated Wordnet into the engine.  Wordnet is available in RDF as a series of triples.  As well as all the word definitions grouped into synonym sets (synsets) it also includes relationships like class relationships &#8216;<a href="http://en.wikipedia.org/wiki/Hyponymy">hyponym</a>&#8216; or &#8216;isa&#8217; and part relationships &#8216;<a href="http://en.wikipedia.org/wiki/Meronym">meronym</a>&#8216; or &#8216;<a href="http://en.wikipedia.org/wiki/Holonymy">holonym</a>&#8216;.</p>
<p>By building a simple in-memory graph of all these relationships my engine can now use them to infer interface types on objects.  To define an interface corresponding to a Wordnet synset like a mammal (wn30:synset-mammal-noun-1) you simply define an interface in the namespace &#8216;Noun&#8217; having a name of &#8216;mammal1&#8242;.  Through the type inheritance specified in the Wordnet file all mammals now inherit that interface automatically and you can write natural language rules that ask for a mammal and they will get any type of mammal defined in Wordnet.</p>
<p>For example:</p>
<p><a href="http://blog.abodit.com/wp-content/uploads/2011/11/DefineAardvark.png"><img src="http://blog.abodit.com/wp-content/uploads/2011/11/DefineAardvark.png" alt="Wordnet integration with Natural Language Engine" title="Wordnet integration with Natural Language Engine" width="623" height="206" class="alignright size-full wp-image-1651" /></a>  </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.abodit.com/2011/11/integrating-wordnet-with-natural-language-processing-nlp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C# Natural Language Engine connected to Microsoft Dynamics CRM 2011 Online</title>
		<link>http://blog.abodit.com/2011/06/c-natural-language-engine-connected-to-microsoft-crm-2011-online/</link>
		<comments>http://blog.abodit.com/2011/06/c-natural-language-engine-connected-to-microsoft-crm-2011-online/#comments</comments>
		<pubDate>Mon, 06 Jun 2011 06:39:46 +0000</pubDate>
		<dc:creator>Ian Mercer</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[My News]]></category>
		<category><![CDATA[Natural Language Processing]]></category>
		<category><![CDATA[NLP]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[CRM]]></category>

		<guid isPermaLink="false">http://blog.abodit.com/?p=1527</guid>
		<description><![CDATA[In an earlier post I discussed some ideas around a Semantic CRM. Recently I&#8217;ve been doing some clean up work on my C# Natural Language Engine and decided to do a quick test connecting it to a real CRM. As you may know from reading my blog, this natural language engine is already heavily used <a href="http://blog.abodit.com/2011/06/c-natural-language-engine-connected-to-microsoft-crm-2011-online/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<p>In an <a href="http://blog.abodit.com/2011/03/a-semantic-web-ontology-driven-approach-to-crm/">earlier post</a> I discussed some ideas around a <a href="http://blog.abodit.com/2011/03/a-semantic-web-ontology-driven-approach-to-crm/">Semantic CRM</a>.</p>
<p>Recently I&#8217;ve been doing some clean up work on my C# Natural Language Engine and decided to do a quick test connecting it to a real CRM.  As you may know from reading my blog, this natural language engine is already heavily used in my home automation system to control lights, sprinklers, HVAC, music and more and to query caller ID logs and other information.</p>
<p>I recently refactored it to use the Autofac dependency injection framework and in the process realized just how close my NLP engine is to ASP.NET MVC 3 in its basic structure and philosophy!  To use it you create Controller classes and put action methods in them.  Those controller classes use Autofac to get all of the dependencies they may need (services like an email service, a repository, a user service, an HTML email formattting service, &#8230;) and then the methods in them represents a specific sentence parse using the various token types that the NLP engine supports.  Unlike ASP.NET MVC3 there is no Route registration; the method itself represents the route (i.e. sentence structure) that it used to decide which method to call.  Internally my NLP engine has its own code to match incoming words and phrases to tokens and then on to the action methods.  In a sense the engine itself is one big dependency injection framework working against the action methods.  I sometimes wish ASP.NET MVC 3 had the same route-registration-free approach to designing web applications (but also appreciate all the reasons why it doesn&#8217;t).</p>
<p>Another improvement I made recently to the NLP Engine was to develop a connector for the <a href="http://twilio.com">Twilio</a> SMS service.  This means that my home automation system can now accept SMS messages as well as all the other communication formats it supports: email, web chat, XMPP chat and direct URL commands.  My Twilio connector to NLP supports message splitting and batching so it will buffer up outgoing messages to reach the limit of a single SMS and will send that.  This lowers SMS charges and also allows responses that are longer than a single SMS message.</p>
<p>Using this new, improved version of my Natural Language Engine I decided to try connecting it to a CRM.  I chose Microsoft Dynamics CRM 2011 and elected to use the strongly-typed, early-bound objects that you can generate for any instance of the CRM service.  I added some simple sentences in an NLPRules project that allow you to tell it who you met, and to input some of their details.  Unlike a traditional forms-based approach the user can decide what information to enter and what order to enter it in.  The Natural Language Engine supports the concept of a conversation and can remember what you were discussing allowing a much more natural style of conversation that some simple rule-based engines and even allowing it to ask questions and get answers from the user.</p>
<p>Here&#8217;s a screenshot showing a sample conversation using Google Talk (XMPP/Jabber) and the resulting CRM record in Microsoft CRM 2011 Online.   You could have the same conversation over SMS or email.   Click to enlarge.</p>
<p><a href="http://blog.abodit.com/wp-content/uploads/2011/06/NLPCRM.png"><img src="http://blog.abodit.com/wp-content/uploads/2011/06/NLPCRM-300x171.png" alt="A natural language interface to CRM" title="A natural language interface to CRM" width="300" height="171" class="aligncenter size-medium wp-image-1529" /></a></p>
<p>Based on my limited testing this looks like another promising area where a truly fluent, conversational-style natural language engine could play a significant role.  Note how it understands email addresses, phone numbers and such like and in code these all become strongly typed objects.  Where it really excels is in temporal expressions where it can understand things like &#8220;who called on a Saturday in May last year?&#8221; and can construct an efficient SQL query from that.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.abodit.com/2011/06/c-natural-language-engine-connected-to-microsoft-crm-2011-online/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>An ontology triple (quad) store for RDF/OWL using Entity Framework 4</title>
		<link>http://blog.abodit.com/2010/05/an-ontology-triple-quad-store-for-rdfowl-using-entity-framework-4/</link>
		<comments>http://blog.abodit.com/2010/05/an-ontology-triple-quad-store-for-rdfowl-using-entity-framework-4/#comments</comments>
		<pubDate>Wed, 12 May 2010 22:34:21 +0000</pubDate>
		<dc:creator>Ian Mercer</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[NLP]]></category>
		<category><![CDATA[Semantic Web]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[Ontology]]></category>
		<category><![CDATA[OWL]]></category>
		<category><![CDATA[RDF]]></category>

		<guid isPermaLink="false">http://blog.abodit.com/?p=859</guid>
		<description><![CDATA[This weeks side-project was the creation of an ontology store using Entity Framework 4. An ontology store stores axioms consisting of Subject, Predicate, Object which are usually serialized as RDF, OWL, N3, &#8230; Whereas there&#8217;s lots of details about these serialization formats, the actual mechanics of how to store and manipulate them was somewhat harder <a href="http://blog.abodit.com/2010/05/an-ontology-triple-quad-store-for-rdfowl-using-entity-framework-4/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<p>This weeks side-project was the creation of an ontology store using Entity Framework 4.  An ontology store stores axioms consisting of Subject, Predicate, Object which are usually serialized as RDF, OWL, N3, &#8230;  Whereas there&#8217;s lots of details about these serialization formats, the actual mechanics of how to store and manipulate them was somewhat harder to come by.  Nevertheless, after much experimentation I came up with an Entity Model that can store Quads (Subject, Predicate, Object and Meta) or Quins (Subject, Predicate, Object, Meta, Graph).  The addition of Meta allows one Axiom to reference another.  The addition of Graph allows the store to be segmented making it easy to import some N3 or RDF into a graph, then flush that graph if it is no longer needed or if a newer version becomes available.</p>
<p>The store is currently hooked up to an Euler reasoner that can reason against it, lazily fetching just the necessary records from the SQL database that backs the Entity Model.</p>
<p>Here&#8217;s the EDMX showing how I modeled the Ontology Store:</p>
<p><a href="http://blog.abodit.com/wp-content/uploads/2010/05/OntologyEDMX.png"><img src="http://blog.abodit.com/wp-content/uploads/2010/05/OntologyEDMX.png" alt="Ontology Store Entity Model" title="Ontology Store Entity Model" width="841" height="528" class="aligncenter size-full wp-image-858" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.abodit.com/2010/05/an-ontology-triple-quad-store-for-rdfowl-using-entity-framework-4/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Applying the Semantic Web to Home Automation</title>
		<link>http://blog.abodit.com/2010/04/thinking-about-semantic-web-applications-to-home-automation-owl-rdf/</link>
		<comments>http://blog.abodit.com/2010/04/thinking-about-semantic-web-applications-to-home-automation-owl-rdf/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 19:54:21 +0000</pubDate>
		<dc:creator>Ian Mercer</dc:creator>
				<category><![CDATA[Home Automation]]></category>
		<category><![CDATA[NLP]]></category>
		<category><![CDATA[OWL]]></category>
		<category><![CDATA[Semantic Web]]></category>

		<guid isPermaLink="false">http://blog.abodit.com/?p=752</guid>
		<description><![CDATA[Recently I&#8217;ve been considering how the Semantic Web will impact home automation. Technologies like the Web Ontology Language (OWL) and RDF allow for the construction of complex ontologies that define what things are, and how they relate. Using these ontologies automated reasoning can be applied to generate new facts or to prove or disprove assertions. <a href="http://blog.abodit.com/2010/04/thinking-about-semantic-web-applications-to-home-automation-owl-rdf/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<p>Recently I&#8217;ve been considering how the Semantic Web will impact home automation.</p>
<p>Technologies like the <a href="http://en.wikipedia.org/wiki/Web_Ontology_Language">Web Ontology Language (OWL)</a> and RDF allow for the construction of complex ontologies that define what things are, and how they relate.  Using these ontologies automated reasoning can be applied to generate new facts or to prove or disprove assertions.</p>
<p>This sounds like the ideal companion to the Natural Language Processing (NLP) Engine that I have already created for the my home automation system.  With reasoning powers added to the natural language engine and the ability to augment the knowledge base by adding new assertions the whole system will be much more powerful.  One day it might even be possible to create the entire home definition using a natural language text file and to query the system using rich natural language queries.</p>
<p>So, the first step is to find an existing ontology store and reasoning engine.  A quick web search reveals that most are built in Java.  There were a couple of links I came across later for .NET:  <a href="http://razor.occams.info/code/semweb/">http://razor.occams.info/code/semweb/</a> and <a href="http://www.intellidimension.com/products/semantics-server/">http://www.intellidimension.com/products/semantics-server/</a>.  There&#8217;s also an interesting Q&amp;A site at http://semanticoverflow.com which has lots of useful information on it.</p>
<p>But rather than starting with some existing library I really wanted to understand more deeply how an ontology store works and how a reasoning engine functions, so over the course of a couple of evenings I created my own.  I now have a triple store and a simple reasoning engine.  Here&#8217;s an <em>actual conversation</em> so you can see what it&#8217;s capable of so far and can perhaps get a glimpse at how powerful this concept could be:-</p>
<blockquote><p>house is a class<br />
contains is a property<br />
contain is a property<br />
contains is the same as contain<br />
contain is the same as contains<br />
contains is transitive<br />
contain is transitive<br />
first floor is a class<br />
room is a class<br />
kitchen is a room<br />
first floor contains kitchen<br />
house contains first floor<br />
does house contain kitchen</p>
<p>House:  Yes, house contain kitchen because [house contains first floor] -&gt; [first floor contains kitchen]</p></blockquote>
<p>As you can see my semantic store can already represent classes, relationships between classes, new relationships (&#8216;contains&#8217;), relationships between relationships (&#8216;same as&#8217;).  For such a small amount of code it&#8217;s quite surprising what this system can now handle in terms of knowledge representation and simple reasoning.</p>
<p>Next time I get some spare time I&#8217;ll hook it up to the actual home model so you can start to query that in much more powerful ways than before.</p>
<p>Stay tuned!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.abodit.com/2010/04/thinking-about-semantic-web-applications-to-home-automation-owl-rdf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A strongly-typed natural language engine (C# NLP)</title>
		<link>http://blog.abodit.com/2010/02/a-strongly-typed-natural-language-engine-c-nlp/</link>
		<comments>http://blog.abodit.com/2010/02/a-strongly-typed-natural-language-engine-c-nlp/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 07:05:53 +0000</pubDate>
		<dc:creator>Ian Mercer</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Home Automation]]></category>
		<category><![CDATA[Natural Language Processing]]></category>
		<category><![CDATA[NLP]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://blog.abodit.com/?p=491</guid>
		<description><![CDATA[Here is an explanation of the natural language engine that powers my home automation system. It&#8217;s a strongly-typed natural language engine with tokens and sentences being defined in code. It currently understands sentences to control lights, heating, music, sprinklers, &#8230; You can ask it who called, you can tell it to play music in a <a href="http://blog.abodit.com/2010/02/a-strongly-typed-natural-language-engine-c-nlp/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<p>Here is an explanation of the natural language engine that powers my home automation system.  It&#8217;s a strongly-typed natural language engine with tokens and sentences being defined in code.  It currently understands sentences to control lights, heating, music, sprinklers, &#8230; You can ask it who called, you can tell it to play music in a particular room, &#8230;  it tells you when a car comes down the drive, when the traffic is bad on I-90, when there&#8217;s fresh snow in the mountains, when it finds new podcasts from NPR, &#8230; and much more.</p>
<p>The natural language engine itself is a separate component that I hope one day to use in other applications.</p>
<h2>Existing Natural Language Engines</h2>
<ul>
<li>Have a large, STATIC dictionary data file</li>
<li>Can parse complex sentence structure</li>
<li>Hand back a tree of tokens (strings)</li>
<li>Don’t handle conversations</li>
</ul>
<h2>C# NLP Engine</h2>
<ul>
<li>Defines strongly-typed tokens in code</li>
<li>Uses type inheritance to model ‘is a’</li>
<li>Defines sentences in code</li>
<li>Rules engine executes sentences</li>
<li>Understands context (conversation history)</li>
</ul>
<h2>Sample conversation</h2>
<h1><a href="http://blog.abodit.com/wp-content/uploads/2010/02/SampleConversation.png"><img class="alignnone size-full wp-image-497" title="Sample Conversation with Natural Language Engine (NLP)" src="http://blog.abodit.com/wp-content/uploads/2010/02/SampleConversation.png" alt="" width="1008" height="635" /></a></h1>
<h2>Goals</h2>
<ul>
<li>Make it easy to define tokens and sentences (not XML)</li>
<li>Safe, compile-time checked definition of the syntax and grammar (not XML)</li>
<li>Model real-world inheritance with C# class inheritance:</li>
<li>‘a labrador’ is ‘a dog’ is ‘an animal’ is ‘a thing’</li>
<li>Handle ambiguity, e.g.</li>
</ul>
<pre>play something <span style="text-decoration: underline;">in</span> the air tonight <span style="text-decoration: underline;">in</span> the kitchen
remind me <span style="text-decoration: underline;">at 4pm</span> to call john <span style="text-decoration: underline;">at 5pm</span></pre>
<h2>C# NLP Engine Structure</h2>
<p><a href="http://blog.abodit.com/wp-content/uploads/2010/02/NLPStructure.png"><img class="alignnone size-full wp-image-500" title="Natural Language Engine Structure" src="http://blog.abodit.com/wp-content/uploads/2010/02/NLPStructure.png" alt="" width="1008" height="630" /></a></p>
<h2>Tokens &#8211; Token Definition</h2>
<ul>
<li> A hierarchy of Token-derived classes</li>
<li> Uses inheritance, e.g. <strong>TokenOn</strong> is a <strong>TokenOnOff</strong> is a <strong>TokenState</strong> is a <strong>Token</strong>.  This allows a single sentence rule to handle multiple cases, e.g. On and Off</li>
<li> Derived from base Token class</li>
<li> Simple tokens are a set of words, e.g. « is | are »</li>
<li> Complex tokens have a parser, e.g. TokenDouble</li>
</ul>
<h2>A Simple Token Definition</h2>
<pre class="brush: csharp; title: ; notranslate">
public class TokenPersonalPronoun : TokenGenericNoun
{
   internal static string wordz { get { return &quot;he,him,she,her,them&quot;; } }
}
</pre>
<ul>
<li> Recognizes any of the words specified</li>
<li> Can use inheritance (as in this example)</li>
</ul>
<h2>A Complex Token</h2>
<pre class="brush: csharp; title: ; notranslate">
public abstract class TokenNumber : Token
{
  public static IEnumerable&lt;TokenResult&gt; Initialize(string input)
  {
  …
</pre>
<ul>
<li>Initialize method parses input and returns one or more possible parses.</li>
</ul>
<p><strong>TokenNumber</strong> is a good example:</p>
<ul>
<li>Parses any numeric value and returns one or more of TokenInt, TokenLong, TokenIntOrdinal, TokenDouble, or TokenPercentage results.</li>
</ul>
<h2>The catch-all <strong>TokenPhrase</strong></h2>
<pre class="brush: csharp; title: ; notranslate">public class TokenPhrase : Token</pre>
<p>TokenPhrase matches anything, especially anything in quote marks</p>
<pre>   e.g. add a reminder "call Bruno at 4pm"</pre>
<p>The sentence signature to recognize this could be</p>
<pre>(…, TokenAdd, TokenReminder, TokenPhrase, TokenExactTime)</pre>
<p>This would match the rule too …</p>
<pre>add a reminder <em>discuss 6pm conference call with Bruno</em> at 4pm</pre>
<h2>TemporalTokens</h2>
<p>A complete set of tokens and related classes for representing time</p>
<ul>
<li>Point in time, e.g. today at 5pm</li>
<li>Approximate time, e.g. who called at 5pm today</li>
<li>Finite sequence, e.g. every Thursday in May 2009</li>
<li>Infinite sequence, e.g. every Thursday</li>
<li>Ambiguous time with context, e.g. remind me on Tuesday (context means it is next Tuesday)</li>
<li>Null time</li>
<li>Unknowable/incomprehensible time</li>
</ul>
<h2>TemporalTokens (Cont.)</h2>
<p>Code to merge any sequence of temporal tokens to the smallest canonical representation,</p>
<p>e.g.</p>
<p>the first thursday in may 2009</p>
<p>-&gt;<br />
{TIMETHEFIRST the first} + {THURSDAY thursday} + {MAY in may} + {INT 2009 -&gt; 2009}</p>
<p>-&gt;<br />
[TEMPORALSETFINITESINGLEINTERVAL [Thursday 5/7/2009] ]</p>
<h1>TemporalTokens (Cont.)</h1>
<p>Finite <strong>TemporalClasses</strong> provide</p>
<li>A way to enumerate the DateTimeRanges they cover</li>
<p>All <strong>TemporalClasses </strong>provide</p>
<li>A LINQ expression generator and Entity-SQL expression generator allowing them to be used to query a database</li>
<h1>Existing Token Types</h1>
<ul>
<li>Numbers (double, long, int, percentage, phone, temperature)</li>
<li>File names, Directories</li>
<li>URLs, Domain names</li>
<li>Names, Companies, Addresses</li>
<li>Rooms, Lights, Sensors, Sprinklers, …</li>
<li>States (On, Off, Dim, Bright, Loud, Quiet, …)</li>
<li>Units of Time, Weight, Distance</li>
<li>Songs, albums, artists, genres, tags</li>
<li>Temporal expressions</li>
<li>Commands, verbs, nouns, pronouns, …</li>
</ul>
<h2>Rules &#8211; A simple rule</h2>
<pre class="brush: csharp; title: ; notranslate">
   /// &amp;lt;summary&amp;gt;
   /// Set a light to a given state
   /// &amp;lt;/summary&amp;gt;
   private static void LightState(NLPState st, TokenLight tlight, TokenStateOnOff ts)
   {
      if (ts.IsTrueState == true) tlight.ForceOn(st.Actor);
      if (ts.IsTrueState == false) tlight.ForceOff(st.Actor);
      st.Say(&quot;I turned it &quot; + ts.LowerCased);
   }
</pre>
<p>Any method matching this signature is a sentence rule:-   NLPState, Token*</p>
<p>Rule matching respects inheritance, and variable repeats … (NLPState st, TokenThing tt, TokenState tokenState, TokenTimeConstraint[] constraints)</p>
<p>Rules are discovered on startup using Reflection and an efficient parse graph is built allowing rapid detection and rejection of incoming sentences.</p>
<h2>State &#8211; NLPState</h2>
<ul>
<li>Every sentence method takes an NLPState first parameter</li>
<li>State includes RememberedObject(s) allowing sentences to react to anything that happened earlier in a conversation</li>
<li>Non-interactive uses can pass a dummy state</li>
<li>State can be per-user or per-conversation for non-realtime conversations like email
<ul>
<li>Chat (e.g Jabber/Gtalk)</li>
<li>Web chat</li>
<li>Email</li>
<li>Calendar (do X at time Y)</li>
<li>Rich client application</li>
</ul>
<ul>
<li>Strongly-typed natural language engine</li>
<li>Compile time checking, inheritance, …</li>
<li>Define tokens and sentences (rules) in C#</li>
<li>Strongly-typed tokens: numbers, percentages, times, dates, file names, urls, people, business objects, …</li>
<li>Builds an efficient parse graph</li>
<li>Tracks conversation history</li>
</ul>
</li>
<h2>User Interface</h2>
<p>Works with a variety of user interfaces</p>
<h2>Summary</h2>
<h1>Future plans</h1>
<p><strong>Expanded corpus of knowledge</strong></p>
<li>Company names, locations, documents, …</li>
<p><strong>Generate iCal/Gdata Recurrence</strong></p>
<li>From TimeExpressions</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.abodit.com/2010/02/a-strongly-typed-natural-language-engine-c-nlp/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

