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

Lucene 需要从自由文本中提取信息,如位置、课程等信息,lucene,nlp,text-parsing,Lucene,Nlp,Text Parsing,我需要为教育领域编写一个文本解析器,它可以从自由文本中提取出学院、地点、课程等信息 目前我正在通过lucene进行,步骤如下: 索引所有与学院、课程和地点相关的数据 制作自由文本的木瓦,在location、course和institute index目录中搜索每个木瓦,然后尝试找出文本的哪个部分代表location、course等 在这种方法中,我遗漏了很多像B.tech这样的案例,它们可以写成btech、B-tech或B.tech 我想知道有什么东西可以做所有这些事情,我听说过Ling pip

我需要为教育领域编写一个文本解析器,它可以从自由文本中提取出学院、地点、课程等信息

目前我正在通过lucene进行,步骤如下:

  • 索引所有与学院、课程和地点相关的数据
  • 制作自由文本的木瓦,在location、course和institute index目录中搜索每个木瓦,然后尝试找出文本的哪个部分代表location、course等
  • 在这种方法中,我遗漏了很多像B.tech这样的案例,它们可以写成btech、B-tech或B.tech


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

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

    我没有使用Lucene,但在您的情况下,我将保留相同关键字的不同形式,只保留一个链接表之类的内容。在这个表中,我将保留这些不同形式的关系。

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


    在选择analyzer/tokenizer时要小心,因为像B.tech这样的词可以很容易地分成两个不同的词(即Btech)。

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

    在选择analyzer/tokenizer时要小心,因为像B.tech这样的词很容易分成两个不同的词(即Btech)。

    您可能需要检查。作为Lingpipe和Gate,这个框架的特点是文本注释,这正是您要做的。以下是帮助您编写UIMA注释器的教程:

    UIMA有,特别是。

    您可能需要检查。作为Lingpipe和Gate,这个框架的特点是文本注释,这正是您要做的。以下是帮助您编写UIMA注释器的教程:

    UIMA有,特别是一个。你肯定需要。GATE有两个最常用的功能(在数千个功能中):规则和字典。字典(GATE术语中的地名录)允许您将所有可能的情况,如“B.tech”、“btech”等放在一个文本文件中,让GATE查找并标记所有情况。规则(更准确地说,JAPE规则)允许您在文本中定义模式。例如,以下是麻省理工学院的邮政地址(“马萨诸塞大道77号,马萨诸塞州剑桥市XX号楼,邮编02139”):

    其中
    (SP)
    (逗号)
    -宏(只是为了缩短文本),
    {Somthing}
    -是注释,
    {Token.kind==number}
    -注释“Token”,其特征“kind”等于“number”(即文本中的数字),
    {Lookup}
    -从字典中捕获值的注释(顺便说一句,GATE已经有了针对美国城市等事物的词典)。这是一个非常简单的例子,但你应该看到,即使是非常复杂的情况,你也可以轻松地处理。

    你肯定需要。GATE有两个最常用的主要功能(在数千个功能中):规则词典(GATE术语中的地名录)允许您将所有可能的案例(如“B.tech”、“btech”等)放在一个文本文件中,让GATE查找并标记所有案例。规则(更准确地说,JAPE规则)允许您在文本中定义模式。例如,这里的模式可以捕获麻省理工学院的邮政地址(“马萨诸塞大道77号,XX大楼,马萨诸塞州剑桥02139”):

    其中
    (SP)
    (逗号)
    -宏(只是为了缩短文本),
    {Somthing}
    -是注释,
    {Token.kind==number}
    -注释“Token”,其特征“kind”等于“number”(即文本中的数字),
    {Lookup}
    -从字典中捕获值的注释(顺便说一句,盖特已经有了美国城市等方面的词典)。这是一个非常简单的例子,但你应该看到,即使是非常复杂的情况,你也可以很容易地处理。

    你可以试试 地址解析规则示例

      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)
                );
    
    你可以试试 地址解析规则示例

      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)
                );
    
    B.tech可以写成btech、B-tech或B.tech

    Lucene将允许您根据Levenshtein距离进行操作。查询
    漫游
    (注意
    ~
    )将找到
    泡沫
    漫游
    等术语

    这可能允许您匹配不同的情况

    B.tech可以写成btech、B-tech或B.tech

    Lucene将允许您根据Levenshtein距离进行操作。查询
    漫游
    (注意
    ~
    )将找到
    泡沫
    漫游
    等术语

    这可能允许您匹配不同的情况