分词表示意外的标记

分词表示意外的标记

php小编小新在这里为大家介绍一种非常有趣的技术——分词表示意外的标记。分词是自然语言处理中的一个重要任务,它将一段文本按照一定的规则进行切分,得到一系列的词语。而在分词过程中,我们有时会遇到一些特殊的情况,比如在某些词语中出现了意外的标记,这可能会对后续的处理造成困扰。因此,研究如何表示和处理这种意外的标记就变得非常重要。在本文中,我们将介绍一些常见的意外标记,并给出相应的解决方案,希望能对大家有所帮助。

问题内容

我正在玩一个分词来学习如何解析,但我无法确定为什么这是意外的。

// nolint: golint, duplpackage mainimport (    "fmt"    "io"    "github.com/alecthomas/participle/v2"    "github.com/alecthomas/participle/v2/lexer")var htaccesslexer = lexer.mustsimple([]lexer.simplerule{    {"comment", `^#[^]*`},    {"ident", `^w+`},    {"int", `d+`},    {"string", `("(\"|[^"])*"|s+)`},    {"eol", `[]+`},    {"whitespace", `[ ]+`},})type htaccess struct {    directives []*directive `@@*`}type directive struct {    pos lexer.position    errordocument *errordocument `@@`}type errordocument struct {    code int    `"errordocument" @int`    path string `@string`}var htaccessparser = participle.mustbuild[htaccess](    participle.lexer(htaccesslexer),    participle.caseinsensitive("ident"),    participle.unquote("string"),    participle.elide("whitespace"),)func parse(r io.reader) (*htaccess, error) {    program, err := htaccessparser.parse("", r)    if err != nil {        return nil, err    }    return program, nil}func main() {    v, err := htaccessparser.parsestring("", `errordocument 403 test`)    if err != nil {        panic(err)    }    fmt.println(v)}

登录后复制

据我所知,这似乎是正确的,我期望 403 在那里,但我不确定为什么它不识别它。

编辑:我将词法分析器更改为:

var htaccessLexer = lexer.MustSimple([]lexer.SimpleRule{    {"dir", `^w+`},    {"int", `d+`},    {"str", `("(\"|[^"])*"|S+)`},    {"EOL", `[]+`},    {"whitespace", `s+`},})

登录后复制

错误消失了,但它仍然打印一个空数组,不知道为什么。我也不确定为什么对词法分析器使用不同的值可以修复它。

解决方法

我相信我发现了问题,这是顺序,ident 通过 w 标签在我的词法分析器中查找数字,因此这导致我的整数被标记为 ident。

我发现我必须将 quotedstrings 和 unquotedstrings 分开,否则未加引号的字符串会获取整数。或者,我可以确保它只获取非数字值,但这会错过 stringwithnum2 之类的东西

这是我的解决方案

var htaccesslexer = lexer.mustsimple([]lexer.simplerule{    {"comment", `(?i)#[^]*`},    {"quotedstring", `"(\"|[^"])*"`},    {"number", `[-+]?(d*.)?d+`},    {"unquotedstring", `[^ ]+`},    {"ident", `^[a-za-z_]`},    {"eol", `[]+`},    {"whitespace", `[ ]+`},})

登录后复制

type ErrorDocument struct {    Pos lexer.Position    Code int    `"ErrorDocument" @Number`    Path string `(@QuotedString | @UnQuotedString)`}

登录后复制

这解决了我的问题,因为它现在查找带引号的字符串,然后查找数字,然后查找不带引号的字符串。

以上就是分词表示意外的标记的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2358197.html

(0)
上一篇 2025年3月1日 16:52:43
下一篇 2025年3月1日 16:52:58

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论