-
Notifications
You must be signed in to change notification settings - Fork 18
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
关于 keyCaseSensitive
和 stripKey
的预期行为
#41
Comments
大小写的问题我们在 #28 中进行了比较详细的讨论,这个词典也是 @danjame 提供的。 针对上述建议,我的理解是这样的:
我原来的解决思路是通过使用不同的 CompareFn 来实现快速查找
如果
如果
|
多谢。我问这个是因为之前我这边 debug 报 assert 失败(我上面错写为 test),不知道为什么,现在又没问题了,很奇怪,可能与脏目录有关吧。 |
@songxiaocheng 刚刚我 master 推了一个修复了一些问题的分支,KeyCaseSensitive 目前工作没有问题 |
@terasum 我知道怎么回事了,你后来的提交把 我认为这个问题有必要好好解决, |
以上面举的 'Holanda' 为例,由于 当查询 'Holanda' 时, 由于大小写不敏感,因此采用了大小写不敏感的 现在的实现是两级二分查找,先用二分查找找到 block (通过 我认为如果要按照我最顶上说的方式4实现,有两种做法。 第一种做法,用不同的 第二种做法,在大小写不敏感的情况下,“仅大小写不同”的单词被认为是等值的,那么就意味着单词列表中有2个(或更多)等值的单词(当然这些等值的单词是连续的),那么可以把两级二分查找都改成返回一个区间,然后再从中选择一个返回。 我觉得第一种做法更好,第二种做法要魔改二分查找,可能遇到奇奇怪怪的、意料之外的问题, 最后,还有一个要注意的是,在极端情况下,“仅大小写不同”的单词可能有多条,比如3条,如果没有精确匹配的,返回哪个呢?任一个都可以吗?当然这种情况实际中可能极少,可以暂不特殊处理,找到哪个是哪个,只要保证精确匹配优先即可。 |
我仔细研究了一下你的观点,我觉得有几个前提还需要明确一下:
在这种情况下,即使我们精确匹配到了某个词,还需要往后搜索至少一个 再考虑这种情况:
这种情况则更加麻烦,在匹配不到 综上,我认为用户的意图永远都是
|
@terasum 第一条我们认知是一致的。 至于小语种情况,我们是用 toLowerCase 来设置的,寄希望于js能够处理,即使不能,也可以在 toLowerCase 这里扩充多语种支持。 最后,对于MDD文件来说,大小写敏感性设置非常关键,需要尊重词典设计,如果不按词典自身的设置来,资源文件很容易找不到的。 即使对于MDX来说,用户可不光是打字输入,也可能是复制粘贴,强行大小写敏感并非长久之策。 |
mdd 文件我今天也进行了几个用例的测试,目前采用了一个 localCompare 的函数姑且可以解决,说到 mdd 我还是坚持,如果用户查询 |
我手头就有这种词典,他们definition里面里面是大写名字的css,但是mdd里面是小写名字,匹配失败。没有了资源文件,看到的是一团混乱。这个词典,几乎所有支持 mdict 格式的词典产品(如欧路等)都可以正常解析,但我们强行 KeyCaseSensitive 为 true 的情况下,就无法找到资源。 最关键的是,我是不能在我项目里直接 toLowerCase 的,因为不能保证 mdd 里面都是小写(即使是 case insensitive 的情况),mdd 里面的 key 和 definition里面的链接大小写都可能有。制作者可能出于某些原因刻意为之,也可能是因为疏忽,我也见过词典 mdd 里面打包了
我认为本库作为底层 reader,不应揣摩用户意图,那是应用层的事。本库应该致力于正确呈现词典制作者想要呈现的词典的内容。制作词典的人设置的 KeyCaseSensitive 正是他用来调试自己词典的设置。作为一个 mdict reader, 只有严格按照词典设置去工作,才能尽可能和词典制作者调试的时候看到的一致。他调试的时候没问题,我们就大概率不会出问题。 有些词典有词条之间的关联 综上,我认为最好的做法就是默认遵守词典的设置。如果本库调用方有自己的想法,给他们设置的接口就好了。多一个选项,多一种可能,调用者可以强行设置,不强行就用词典默认,只要工作正常,岂不是比一律 case sensitive 更好? |
@songxiaocheng 上述中的:
“只有严格按照词典设置去工作” 这点我是赞同的,我们再回来看这句话所代表的含义:
在现有的实现中:
现在的实现存在的几个问题: 因此其实就是第一个问题需要解决,即 另外,我觉得 mdd 文件中,如果 definition 中是大写的引用路径,结果返回了小写的结果,比如 我先合并你的PR看下效果好了 |
可见对预期行为我们是一致的。我是完全按照这个思路去实现的,实际用的 KeyCaseSensitive (通过新增的
你说的应该是我之前提的 PR #37 出现的情况,那时我想的比较简单,随后我也发现了问题,结果是因为词典中小写在前,大写紧随其后,可是由于大小写不敏感,搜到小写就认为匹配,直接返回了。也正是如此,我提出本 Issue 就是希望理清预期行为,从而解决大小写问题。后来你的 PR #44 通过忽略词典的设置,通过了测试,但是正如我说的,这实际上没有解决问题而只是隐藏了问题。 因而我提出了 PR #45。在此之后,优先返回”大小写敏感(精确)“的匹配,如果输入是大写,则只要存在对应”大小写一致“的key,会返回这一条的。只有当不存在大小写一致的情况,才会返回”仅大小写不一致“的匹配。由于词典设置 KeyCaseSensitive 为 No,(在没有 searchOptions.keyCaseSensitive 强行设置的情况下)这是符合预期的。 也可以再添加一些相关测试,我是意图按上述描述去实现的。 |
补充了几个测试,目前没有发现问题,还有一些边缘条件需要完善,后续补充。 |
这里应该写反了,根据你提到的 #28 中的讨论(#28 (comment) )以及我的实测,应该是
|
@songxiaocheng 是的,应该是你这个实测的结果,是我记错了 |
以
keyCaseSensitive
为例,当同时存在仅大小写不同的单词时,期望的行为是如何?比如测试词典中的"dict-01-袖珍葡汉汉葡词典(简体版).mdx"设置的是
KeyCaseSensitive: 'No'
, 词典中同时存在 holanda 和 Holanda,当查询其中一个词条时,有以下几种方式:其实我认为该测试词典的制作是有不妥的,因为既然设置了大小写不敏感,就不应同时提供两个仅大小写不同的词条,应该将二者放在同一个词条里,或者设置大小写敏感。
第1种方式我认为应当首先排除,因为其无视了词典的设置。该库调用者若有需要可以强行覆盖设置的。
不过,若需要兼容部分词典已经发生这种现象(大小写不敏感但是大小写分不同词条)的既定事实,则需考虑其它方式。
第2种方式我认为也应当排除,因为造成使用上的不便(我们不希望搜索“Holanda”时,词典中明明存在“Holanda”,却只返回“holanda”,造成词典中的“Holanda”无法被查询到)。
方式3的问题是,若以拼合字符串返回,则相当于事实上调整了词条内容,作为 mdict reader 这样似乎也不妥;若以数组返回,则需要改动接口。
方式4的话感觉最佳?
方式3和方式4实现起来很可能都需要二次查询。
The text was updated successfully, but these errors were encountered: