通常使用Lark/Python或DCG/Prolog等解析器解析文本
取而代之的是标记数据字符串,从某种意义上说,它仍然是单词序列,但实际上是元组列表
例如:
word1 word2 ... ==process==> [(word1,tag1), (word2, tag5), (w3,t3) ...] ==parser==> struct[ predicate1(word2,word5), p2(w2,w1), ...]
我想以与普通字符串类似的方式解析它,即使用语法和其他东西。。 i、 e.匹配主要基于标记属性,有时基于单词本身
因此,我现在正在构建元组列表,将来可能是树列表/ast。 目前我只解析单个句子,一个接一个
下面是标记化结构的样子(我通过spacy传递):
You will have to join us before the match starts.
[('You', 'PRON', 'nsubj'), ('will', 'VERB', 'aux'), ('have', 'AUX', 'ROOT'), ('to', 'PART', 'aux'), ('join', 'VERB', 'xcomp'), ('us', 'PRON', 'dobj'), ('before', 'ADP', 'mark'), ('the', 'DET', 'det'), ('match', 'NOUN', 'nsubj'), ('starts', 'VERB', 'advcl'), ('.', 'PUNCT', 'punct')]
我可能会在将来添加更多标签。。这将是预解析阶段的一部分
任何针对Python的解决方案,或最终针对Prolog的解决方案。 目前我选择了Python,但我仍在尝试
Ex文法(伪代码):
Sentence : ....
SVO : token.nsubj token*? token.root token*? token.pobj { sent += svo(root, nsubj, pobj) }
adj : token.adj { sent += adj(word) }
在DCG中,列表元素是泛型的,因为它们是Prolog变量。然后,您可以用最自然的方式表示模式匹配,使用匿名变量
_
,其中不关心实际值:对不起,我不知道spacy格式,请接受我以上的猜测,因为很可能是错的
关于令牌的形成,IMHO可以更容易地将令牌化直接处理到DCG中,而不依赖于lexer。当然,如果文件维度是“合理的”。我这样做是为了解析一些MySQL备份(纯SQL,大约10~30MB),它在SWI Prolog中运行良好
相关问题 更多 >
编程相关推荐