- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在构建一个明确的从句语法来解析 20,000 条半自然文本。随着我的谓词数据库的大小增长(现在多达 1,200 条规则),解析一个字符串可能需要相当长的时间——特别是对于 DCG 当前无法解释的字符串,由于我还没有编码的语法。对于包含 30 个单词的字符串,当前的最坏情况是 3 分钟。我正在尝试弄清楚如何优化它,或者我是否应该开始研究云计算。
我正在使用 SWI-Prolog,它提供了一个“配置文件”目标,它提供了一些统计信息。我惊讶地发现数据库中最简单的规则占用了大部分执行时间。我的语料库包含表示数字的字符串,我想在 scalar/3
中捕获这些字符串。谓词。这些占用了总执行时间的 50-60%。
一开始,我的 scalars.pl
中有 70 行。 ,代表我的语料库中数字的数字和自然语言表示。像这样:
scalar(scalar(3)) --> ["three"].
scalar(scalar(3)) --> ["3"].
scalar(scalar(4)) --> ["four"].
scalar(scalar(4)) --> ["4"].
scalar(scalar(X)) --> [Y], { atom_number(Y, X) }.
sent(sent(VP, NP)) --> vp(VP), np(NP).
vp(vp(V)) --> v(V).
np(np(Qty, Noun)) --> qty(Qty), n(Noun).
scalar(scalar(3)) --> ["three"].
scalar(scalar(X)) --> [Y], { atom_number(Y, X) }.
qty(qty(Scalar)) --> scalar(Scalar).
v(v(eat)) --> ["eat"].
n(n(pie)) --> ["pie"].
最佳答案
您可能要调查的程序的一个方面是确保单个谓词快速成功并快速失败。这对于检查具有许多子句的谓词特别有用。
例如,当 scalar(X) 在一个不是标量的标记上求值时,程序必须尝试 31 次(按您的最后一次计数)才能确定 scalar//1 失败。如果您的程序的结构是针对每个 token 检查 scalar(X) ,那么这可能非常昂贵。
此外,如果 scalar(X) 确实发现 token 匹配但后续目标失败,那么您的程序似乎将重试 scalar(X),直到所有 scalar//1 子句都已尝试。
明智地使用 cut (!) 或 if-then-else (C1->G1;C2->G2;G3) 可以提供巨大的性能改进。
或者您可以构建您的谓词,以便它们依靠索引来选择适当的子句。例如。:
scalar(scalar(N)) --> [Token], {scalar1(Token, scalar(N))}.
scalar1("3", scalar(3)) :- !.
scalar1(Y, scalar(X)) :- atom_number(Y, X).
关于prolog - 是什么让 DCG 谓词变得昂贵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57130192/
我正在阅读 MongoDB,并试图了解它的最佳用途。我没有看到明确答案的一个问题是哪些操作便宜或昂贵,以及在什么条件下。 你能帮忙澄清一下吗? 谢谢。 最佳答案 人们经常声称 mongodb 的写入速
我正在寻找一个主要来源(或一个非常好的解释)来支持在为 iPhone 编写软件时使用 autorelease 是危险的或过于昂贵的说法。 许多开发者都提出了这种说法,我什至听说 Apple 不推荐它,
我意识到这离微优化领域太远了,但我很想知道为什么调用 DateTime.Now 和 DateTime.UtcNow 如此“昂贵”。我有一个示例程序,它运行几个场景来做一些“工作”(添加到一个计数器)并
我是一名优秀的程序员,十分优秀!