【发布时间】:2022-08-19 02:45:02
【问题描述】:
背景
希望改进 tokenization logic 的卷曲直引号的库。
问题
在英文中,一些ambiguous的条件可以在多次通过文本后正确卷曲,例如:
“贾维斯,先生?为什么,他是“几年前列名的。”
这应该编码为:
“Jarvis, sir? Why, him as 'listed some years ago.”并渲染为:
“贾维斯,先生?为什么,他在几年前就被列入名单了。”
我们知道前面的字形列出是撇号 (
'),而不是开放单引号 (‘),因为嵌套引号可能不会在父引号之外关闭。我的解析器是单通的,这意味着它不能正确地卷曲类似的明确标记。
可视化
考虑以下愚蠢的例子:
\“反向散射\'直到奶牛回家栖息或筑巢或\'无论我的鲍勃\',就像巴布斯所说的那样。\”
在下图中,索引 15 处的直单引号是不平衡的,但在一对平衡的直双引号之间(分别为索引 1 和 100),它们本身包括一对嵌套的直单引号(索引 59 和 75 , 分别):
所有信息都用于将
\'til上的撇号与其他直单引号区分开来,因为所有其他直引号都是平衡且明确的(没有\'whatever收缩,也没有bob\'收缩)。数据结构是堆栈和平衡树之间的一种交叉,但两者都不是。
问题
什么数据结构允许跟踪具有 O(1) 查询的平衡嵌套对以确定结构中的值是否在平衡对之间?
可能是B-Tree?
生成图表的代码如下:
graph tree { outputorder=\"edgesfirst\" graph[nodesep=0.5, ranksep=0.5, splines=line]; node [fontname = \"Dejavu Sans\", fontsize=16, style=filled, fillcolor=lightgreen, shape=circle, fixedsize=true, width=0.8]; doc [label=\"doc\", shape=square, fillcolor=lightblue]; n1a [label=\"\\\" 1\"]; n1b [label=\"\' 15\", fillcolor=pink]; n1c [label=\"\\\" 100\"]; bm [style=dashed, label=\"\", shape=square, color=lightblue]; doc -- n1a; doc -- n1b; doc -- bm [style=dotted]; doc -- n1c; { rank=same n1a -- n1b -- bm -- n1c [style=invis] } n2a [label=\"\' 59\"]; n2b [label=\"\' 75\"]; { rank=same n2a -- n2b [style=invis] } bm -- n2a; bm -- n2b; edge [style=dotted]; node [fillcolor=none, shape=square, style=dotted]; what [label=\"what\\never\"]; back -- n1a til -- n1b said -- n1c n2a -- what n2b -- bob }
-
在这个例子中,'直到奶牛回家栖息或筑巢或'无论我的鲍勃',你怎么知道哪个是撇号? \'直到? \'任何?
-
已知的英语缩略集是相当有限的,并且包含在各种列表中(请参阅Contractions.java)。所以我们知道
\'whatever不是缩略词,因此它必须有一个单引号。bob\'也是如此,但作为结束语。也许这样的数据结构不存在。 -
当你知道一组收缩时,为什么不使用它呢?将该列表添加到您的工作中并处理它似乎微不足道。你在完成这项工作时到底遇到了什么问题?
-
按顺序浏览列表非常容易,只需标记已知平衡对之间的未解析引号即可。不过,我可能更喜欢动态编程方法来解决整个问题。
-
谁能推荐什么数据结构对跟踪不平衡和平衡对有用?我想查询沿
tree.isBalanced( token ) && tree.isNested( token )行的结构,其中token是对示例图中直引号/索引15 的引用。查找需要是 O(1)。
标签: java data-structures binary-tree quotes linguistics