【问题标题】:How to implement Markov's algorithm in Java?如何在 Java 中实现马尔可夫算法?
【发布时间】:2015-09-29 04:00:47
【问题描述】:

我想实现找到here 的马尔可夫算法,但我没能做到。正如 wiki 解释的那样,它是一个递归函数,用于替换语言中的模式。例如

  • “A”->“苹果”
  • “B”->“包”
  • “S”->“商店”
  • “T”->“该”
  • “商店”->“我的兄弟”
  • “从未使用过” -> .“终止规则”

这些规则必须在以下文本上实施:

“我从 T S 买了 B of As。”

规则:

  1. 按从上到下的顺序检查规则,看看是否有任何 模式可以在输入字符串中找到。
  2. 如果没有找到,算法将停止。
  3. 如果找到一个(或多个),则使用其中的第一个替换 输入字符串中匹配文本的最左侧出现及其 替换。
  4. 如果刚刚应用的规则是终止规则,则算法停止。
  5. 转到步骤 1。

我想过创建两个类 RuleRuleContainer

规则有 3 个属性:String from、String To 和 Boolean terminating

RuleContainer 有一个动态列表,其中包含活动规则和逻辑函数 [我要创建的那个]。

我已经考虑过 String.replace() 函数,并尝试将其实现为递归函数。

实现马尔可夫算法的最佳方法是什么?

【问题讨论】:

  • SO 不是免费的导师。请至少提供我们可以开始的最少代码。一开始,找到一种可行的方法就足够了,之后您可以搜索最好的方法;-)

标签: java algorithm recursion substitution markov


【解决方案1】:

暂时忽略终止规则部分,递归函数的基本形状如下所示:

String markov(String input, List<Rule> rules) {

  // find the first matching rule, apply it and recurse 
  for (Rule rule : rules) {
    if (rule.matches(input)) {
      String temp = rule.apply(input);
      return markov(temp, rules);
    }
  }

  // no rule matched so just return the input text
  // - this is the terminating case for the recursion
  return input;
}

这将一直调用自身,直到没有规则与当前输入字符串匹配,此时它将展开,将结果一直返回到调用堆栈。您只需将以下方法添加到您的 Rule 类:

public boolean matches(String input) { ... }
public String apply(String input) { ... }

这些可以只是简单的String 函数(containsreplaceFirst 等),或者您可以使用java.util.regex.Patternjava.util.regex.Matcher 来节省每次重新编译recglar 表达式。

对于终止规则,如果匹配的规则是终止规则,则直接返回temp结果,不再递归。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多