解析带标记的datastring,而不是purestring

2024-04-26 21:03:49 发布

您现在位置:Python中文网/ 问答频道 /正文

通常使用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) }

Tags: 字符串标记tokenyou列表have单词will
1条回答
网友
1楼 · 发布于 2024-04-26 21:03:49

在DCG中,列表元素是泛型的,因为它们是Prolog变量。然后,您可以用最自然的方式表示模式匹配,使用匿名变量_,其中不关心实际值:


% SVO : token.nsubj token*? token.root token*? token.pobj { sent += svo(root, nsubj, pobj)  }
svo(svo(Y,X,Z))  >
   [(X,'PRON',nsubj),_,(Y,_,'ROOT'),_,(Z,_,pobj)].

% adj : token.adj { sent += adj(word) }
adj(adj(X))  >
   [(X,_,'ADJ')].

对不起,我不知道spacy格式,请接受我以上的猜测,因为很可能是错的

关于令牌的形成,IMHO可以更容易地将令牌化直接处理到DCG中,而不依赖于lexer。当然,如果文件维度是“合理的”。我这样做是为了解析一些MySQL备份(纯SQL,大约10~30MB),它在SWI Prolog中运行良好

相关问题 更多 >