Lucene 需要从自由文本中提取信息,如位置、课程等信息
我需要为教育领域编写一个文本解析器,它可以从自由文本中提取出学院、地点、课程等信息 目前我正在通过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
我想知道有什么东西可以做所有这些事情,我听说过Ling pipe和Gate,但不知道它们有多高效。我没有使用Lucene,但在你的情况下,我会保留相同关键字的不同形式,只保留一个链接表之类的。在这个表中,我将保留这些不同形式的关系。我没有使用Lucene,但在您的情况下,我将保留相同关键字的不同形式,只保留一个链接表之类的内容。在这个表中,我将保留这些不同形式的关系。您可能需要编写一个正则表达式来涵盖词汇表中的每种可能形式
在选择analyzer/tokenizer时要小心,因为像B.tech这样的词可以很容易地分成两个不同的词(即B和tech)。您可能需要编写一个正则表达式来涵盖词汇表的每种可能形式 在选择analyzer/tokenizer时要小心,因为像B.tech这样的词很容易分成两个不同的词(即B和tech)。您可能需要检查。作为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距离进行操作。查询漫游
(注意~
)将找到泡沫
和漫游
等术语
这可能允许您匹配不同的情况