我需要为教育领域编写一个文本解析器,它可以从自由文本中提取诸如研究所,位置,课程等信息。
目前我正在通过lucene这样做,步骤如下:
在这种方法中,我遗漏了很多像B.tech这样的案例可以写成btech,b-tech或b.tech。
我想知道有什么东西可以做所有这些事情,我听说过Ling-pipe和Gate但是不知道它们有多高效。
答案 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编写注释器:
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~
(请注意~
)会找到foam
和roams
等字词。
这可能会让您匹配不同的情况。