我正在分析人类可读的科学文本,主要是在化学领域。我感兴趣的是将文本分解成一系列单词、科学术语(下面将详细介绍)和标点符号。在
例如,我希望文本“hello,world.”分成4个标记:1)“hello”;2)逗号;3)“world”和4)句点。请注意,空间不需要专门的标记。在
像“吡啶-4”这样的化学术语与“甲基-4”有关。任何学过化学的人都知道这些公式可能很长,可能包含数字、破折号和逗号,有时甚至还有圆括号,但我认为可以肯定的是,这些可爱的表达式不能包含空格。另外,我认为这些表达式必须以数字开头。我希望每一个这样的表达出来作为一个单一的象征。在
今天,我使用手动解析来查找以数字开头并以空格、换行符或标点符号后跟空格或换行符结尾的“块”文本。在
我想知道是否有一个聪明的解决方案(regex或其他)可以用来根据上述规范标记文本。我在Python中工作,但这可能与语言无关。在
输入示例(显然忽略内容…):
“你好。1-甲基-4-苯基吡啶是极坏的。但是,1-甲基-4-苯基-1,2,3,6-四氢吡啶更差。”
示例输出(每个令牌在其自己的行中):
Hello
.
1-methyl-4-phenylpyridinium
is
ultra
-
bad
.
However
,
1-methyl-4-phenyl-1,2,3,6-tetrahydropyridine
is
worse
.
可能会有一个正则表达式来解析您想要的内容,但我不认为它是非常可读/可维护的。我的建议是使用类似ANTLR的解析器生成器。我认为你必须抛弃这样一个观念:你可以把化学描述变成一个单一的符号,太复杂了。ANTLR甚至有一个调试器,这样你就可以知道为什么它没有解析你认为应该解析的东西,我认为使用regexp是不可能的。在
谨致问候
塞巴斯蒂安
这将解决您当前的示例。它可以调整为更大的数据集。在
结果是:
^{pr2}$对不起,没看到非常糟糕。如果有必要把这些词分开。。在
给出:
我同意Sebastiaan Megens的观点,即regex解决方案可能是可能的,但可能不是很可读或可维护的,特别是如果您还不擅长正则表达式。如果您坚持使用Python,我建议使用pyparsing module(我认为这是一个不错的选择)。在
如果您的解析需要增长或改变,额外的可维护性将非常有用。(我相信很多人会说“当”而不是“如果”!例如,有人已经评论说,你可能需要一个更复杂的概念,什么是需要允许作为一个化学名称。也许你的需求在你选择工具之前就已经改变了!)在
相关问题 更多 >
编程相关推荐