我正在为我们的编程课创建我的学校项目。 我正在制作医疗系统控制台应用程序,我想实现这种功能:
当用户输入他们的感受时。 (就像他们感到恶心,喉咙痛等)我希望C Text分析库帮助我分析和解析用户给出的信息(已经保存到字符串中)并确定要给药的药物。 (我将会给出哪种药物,我只想让图书馆帮助我分析用户提供的信息)。
谢谢!
一个很好的例子就是这个: http://www.codeproject.com/Articles/32175/Lucene-Net-Text-Analysis
不幸的是,它适用于C#
更新: 任何C库,甚至可以帮助我简单地标记和索引单词?我知道我可以用蛮力编码来做到这一点......但是一个可靠而稳定的api会更好。谢谢!
答案 0 :(得分:6)
分析自然语言文本是您可能选择的最困难的问题之一。
最有可能的解决方案是简单地寻找“生病”,“喉咙痛”等关键词 - 这可以通过简单的关键词和结果词典来实现。
就真正“理解”用户键入的内容而言 - 祝你好运。
编辑:
值得指出的一些技术:
关于词法分析器的问题 - 如果您觉得需要类似的话,可以轻松使用 flex 。可能比尝试手动编写多令牌搜索更快(在执行速度和开发速度方面)。
在Mac上有一个非常酷的框架叫做潜在语义映射。有一个WWDC 2011视频 - 它很棒。你基本上给它提供了大量的示例输入,并根据你想要的结果进行训练。它可能会像你要的那样接近。它是基于C的。
答案 1 :(得分:1)
这是wakkerbot对您的问题所做的。 (得分很低,因为wakkerbot / Hubert都是荷兰人。) 但令牌师似乎在英语上做得很好:
[ 6]: | 29/ 27| 4.792 | weight |
------|--------+----------+---------+--------+
0 11| 15645 | 10/ 9 | 0.15469 | 0.692 |'to'
1 0| 19416 | 10/10 | 0.12504 | 0.646 |'i'
2 10| 10483 | 4/ 3 | 0.10030 | 0.84 |'and'
3 3| 3292 | 5/ 5 | 0.09403 | 1.4 |'be'
4 7| 27363 | 3/ 3 | 0.06511 | 1.4 |'one'
5 12| 36317 | 3/ 3 | 0.06511 | 8.52 |'this'
6 2| 35466 | 2/ 2 | 0.05746 | 10.7 |'just'
7 4| 12258 | 2/ 2 | 0.05301 | 0.56 |'info'
8 18| 81898 | 2/ 2 | 0.04532 | 20.1 |'ll'
9 20| 67009 | 3/ 3 | 0.04124 | 48.8 |'text'
10 13| 70575 | 2/ 2 | 0.03897 | 156 |'give'
11 19| 16806 | 2/ 2 | 0.03426 | 1.13 |'c'
12 14| 5992 | 2/ 2 | 0.03376 | 0.914 |'for'
13 1| 3940 | 1/ 1 | 0.02561 | 1.12 |'my'
14 5| 7804 | 1/ 1 | 0.02561 | 2.94 |'class'
15 17| 7920 | 1/ 1 | 0.02561 | 7.35 |'feeling'
16 15| 20429 | 3/ 2 | 0.01055 | 3.93 |'com'
17 16| 36544 | 2/ 1 | 0.00433 | 4.28 |'www'
为了支持我的lex / nonlex tokeniser参数,这是wakkerbot的tokeniser的相关部分:
for(pos=0; str[pos]; ) {
switch(*sp) {
case T_INIT: /* initial */
if (myisalpha(str[pos])) {*sp = T_WORD; pos++; continue; }
if (myisalnum(str[pos])) {*sp = T_NUM; pos++; continue; }
/* if (strspn(str+pos, "-+")) { *sp = T_NUM; pos++; continue; }*/
*sp = T_ANY; continue;
break;
case T_ANY: /* either whitespace or meuk: eat it */
pos += strspn(str+pos, " \t\n\r\f\b" );
if (pos) {*sp = T_INIT; return pos; }
*sp = T_MEUK; continue;
break;
case T_WORD: /* inside word */
while ( myisalnum(str[pos]) ) pos++;
if (str[pos] == '\0' ) { *sp = T_INIT;return pos; }
if (str[pos] == '.' ) { *sp = T_WORDDOT; pos++; continue; }
*sp = T_INIT; return pos;
...
正如您所看到的,大部分时间都花费在while ( myisalnum(str[pos]) ) pos++;
的行中,
它捕获了所有的单词。 myisalnum()是一个静态函数,可能会内联。 (当然,数字和空格有类似的紧密循环)
更新:为了完整性,myisalpha()的定义:
static int myisalpha(int ch)
{
/* with <ctype.h>, this is a table lookup, too */
int ret = isalpha(ch);
if (ret) return ret;
/* don't parse, just assume valid utf8 */
if (ch == -1) return 0;
if (ch & 0x80) return 1;
return 0;
}
答案 2 :(得分:0)
是的,有一个名为MeTA的C ++数据科学工具包 - ModErn文本分析工具包。以下是功能:
它附带测试和示例。在你的情况下,我认为统计分类器,如贝叶斯,将完美地完成这项工作,但是,你也可以做手动分类。这是我个人案例的最佳壮举。希望它有所帮助。
最诚挚的问候,