C语言简单文本分析库

时间:2012-02-23 15:12:51

标签: c++ c

我正在为我们的编程课创建我的学校项目。 我正在制作医疗系统控制台应用程序,我想实现这种功能:

当用户输入他们的感受时。 (就像他们感到恶心,喉咙痛等)我希望C Text分析库帮助我分析和解析用户给出的信息(已经保存到字符串中)并确定要给药的药物。 (我将会给出哪种药物,我只想让图书馆帮助我分析用户提供的信息)。

谢谢!

一个很好的例子就是这个: http://www.codeproject.com/Articles/32175/Lucene-Net-Text-Analysis

不幸的是,它适用于C#

更新: 任何C库,甚至可以帮助我简单地标记和索引单词?我知道我可以用蛮力编码来做到这一点......但是一个可靠而稳定的api会更好。谢谢!

3 个答案:

答案 0 :(得分:6)

分析自然语言文本是您可能选择的最困难的问题之一。

最有可能的解决方案是简单地寻找“生病”,“喉咙痛”等关键词 - 这可以通过简单的关键词和结果词典来实现。

就真正“理解”用户键入的内容而言 - 祝你好运。

编辑:

值得指出的一些技术:

关于词法分析器的问题 - 如果您觉得需要类似的话,可以轻松使用 flex 。可能比尝试手动编写多令牌搜索更快(在执行速度和开发速度方面)。

在Mac上有一个非常酷的框架叫做潜在语义映射。有一个WWDC 2011视频 - 它很棒。你基本上给它提供了大量的示例输入,并根据你想要的结果进行训练。它可能会像你要的那样接近。它是基于C的。

http://en.wikipedia.org/wiki/Latent_semantic_mapping

https://developer.apple.com/library/mac/#documentation/TextFonts/Reference/LatentSemanticMapping/index.html

答案 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文本分析工具包。以下是功能:

  • 文本标记化,包括深层语义功能,如解析树
  • 带有压缩的反转和转发索引以及各种缓存策略
  • 搜索索引的排名函数的集合
  • 主题模型
  • 分类算法
  • 图算法
  • 语言模型
  • CRF实施(POS标记,浅层解析)
  • liblinear和libsvm的包装器(包括libsvm数据集解析器)
  • UTF8支持各种语言的分析
  • 多线程算法

它附带测试和示例。在你的情况下,我认为统计分类器,如贝叶斯,将完美地完成这项工作,但是,你也可以做手动分类。这是我个人案例的最佳壮举。希望它有所帮助。

这是链接https://meta-toolkit.org/

最诚挚的问候,