需要从自由文本,位置,课程等信息中提取信息

时间:2011-11-08 12:50:09

标签: lucene nlp text-parsing

我需要为教育领域编写一个文本解析器,它可以从自由文本中提取诸如研究所,位置,课程等信息。

目前我正在通过lucene这样做,步骤如下:

  1. 索引与学院,课程和地点相关的所有数据。
  2. 制作自由文本的带状疱疹并在位置,课程和学院索引目录中搜索每个木瓦,然后尝试找出文本的哪个部分代表位置,课程等。
  3. 在这种方法中,我遗漏了很多像B.tech这样的案例可以写成btech,b-tech或b.tech。

    我想知道有什么东西可以做所有这些事情,我听说过Ling-pipe和Gate但是不知道它们有多高效。

6 个答案:

答案 0 :(得分:1)

你绝对需要GATE。 GATE有两个最常用的功能(数千个其他功能):规则词典。字典(GATE术语中的地名录)允许您将所有可能的案例(如“B.tech”,“btech”等)放在一个文本文件中,让GATE查找并标记所有案例。规则(更准确地说,JAPE规则)允许您在文本中定义模式。例如,这是捕捉麻省理工学院邮政地址的模式(“77 Massachusetts Ave.,Building XX,Cambridge MA 02139”):

{Token.kind == number}(SP){Token.orth == uppercase}(SP){Lookup.majorType == avenue}(COMMA)(SP)
{Token.string == "Building"}(SP){Token.kind == number}(COMMA)(SP)
{Lookup.majorType == city}(SP){Lookup.majorType == USState}(SP){Token.kind == number}

其中(SP)(COMMA) - 宏(只是为了缩短文字),{Somthing} - 是注释,{Token.kind == number} - 注释“令牌”,其功能为“kind”等于“数字”(即文本中的数字),{Lookup} - 从字典中捕获值的注释(BTW,GATE已经有美国城市等字典的字典)。这是一个非常简单的例子,但您应该看到即使是非常复杂的情况也能轻松覆盖。

答案 1 :(得分:0)

我没有使用Lucene,但在你的情况下,我会保留不同形式的相同关键字,只是持有链接表等。在这张表中,我将保持这些不同形式的关系。

答案 2 :(得分:0)

您可能需要编写正则表达式来涵盖词汇表的每种可能形式。

请注意您选择的分析器/标记器,因为像 B.tech 这样的单词可以很容易地分成两个不同的单词(即 B tech < /强>)。

答案 3 :(得分:0)

您可能需要查看UIMA。作为Lingpipe和Gate,这个框架具有文本注释功能,这正是您要做的事情。这是一个教程,可以帮助您为UIMA编写注释器:

http://uima.apache.org/d/uimaj-2.3.1/tutorials_and_users_guides.html#ugr.tug.aae.developing_annotator_code

UIMA有addons,特别是Lucene integration

答案 4 :(得分:0)

您可以尝试http://code.google.com/p/graph-expression/ 地址解析规则的例子

  GraphRegExp.Matcher Token = match("Token");
            GraphRegExp.Matcher Country = GraphUtils.regexp("^USA$", Token);
            GraphRegExp.Matcher Number = GraphUtils.regexp("^\\d+$", Token);
            GraphRegExp.Matcher StateLike = GraphUtils.regexp("^([A-Z]{2})$", Token);
            GraphRegExp.Matcher Postoffice = seq(match("BoxPrefix"), Number);
            GraphRegExp.Matcher Postcode =
                            mark("Postcode", seq(GraphUtils.regexp("^\\d{5}$", Token), opt(GraphUtils.regexp("^\\d{4}$", Token))))
                    ;
            //mark(String, Matcher) -- means creating chunk over sub matcher
            GraphRegExp.Matcher streetAddress = mark("StreetAddress", seq(Number, times(Token, 2, 5).reluctant()));
            //without new lines
            streetAddress = regexpNot("\n", streetAddress);
            GraphRegExp.Matcher City = mark("City", GraphUtils.regexp("^[A-Z]\\w+$", Token));

            Chunker chunker = Chunkers.pipeline(
                    Chunkers.regexp("Token", "\\w+"),
                    Chunkers.regexp("BoxPrefix", "\\b(POB|PO BOX)\\b"),
                    new GraphExpChunker("Address",
                            seq(
                                    opt(streetAddress),
                                    opt(Postoffice),
                                    City,
                                    StateLike,
                                    Postcode,
                                    Country
                            )
                    ).setDebugString(true)
            );

答案 5 :(得分:0)

  

B.tech可以写成btech,b-tech或b.tech

Lucene会根据Levenshtein距离让你fuzzy searches。查询roam~(请注意~)会找到foamroams等字词。

这可能会让您匹配不同的情况。