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