创建DSL:如何将自然文本转换为可执行机器代码?
如何将自然文本规则转换为可执行代码?
当然可以实现!把这类结构化的自然语言规则转换成可执行代码,本质上是轻量级的自然语言到DSL(领域特定语言)/通用代码的转换,下面分几种常见的实现思路,以及不同语言的支持情况:
一、基于规则的简单解析器(最适配你的示例场景)
你的示例是非常规整的句式:If [变量] [比较词] [值] do [操作],这种场景完全可以自己写一个简单的解析器搞定,步骤大概是这样:
- 拆分句子:把输入文本拆成关键片段,比如把"If salary more than 5000 do op1"拆成变量
salary、比较短语more than、数值5000、操作op1 - 关键词映射:把自然语言的比较描述转换成代码里的运算符,比如
more than→>、less than→<、equal to→== - 拼接代码:按照目标语言的语法,把这些片段组合成可执行的代码
给你写个Python的小示例,直接就能跑:
def natural_to_code(natural_text): # 简单拆分(复杂场景可以用NLP分词库优化) parts = natural_text.split() var = parts[1] comp_phrase = " ".join(parts[2:4]) value = parts[4] op = parts[6] # 定义自然语言到运算符的映射 comp_map = { "more than": ">", "less than": "<", "equal to": "==" } comp_op = comp_map.get(comp_phrase, "==") # 生成Python风格的代码 return f"if {var} {comp_op} {value}: {op}" # 测试一下 print(natural_to_code("If salary more than 5000 do op1")) # 输出结果:if salary > 5000: op1
二、借助规则引擎框架(适合复杂规则场景)
如果需要支持更复杂的规则句式,或者后续要扩展更多规则逻辑,可以用现成的规则引擎框架,这类工具通常自带规则解析能力,或者允许你自定义规则映射:
- Drools(Java生态):可以定义规则模板,把自然语言规则转换成Drools的规则语言,再编译执行
- Pyke(Python):基于知识的规则系统,能把自然语言风格的规则转换成可执行的业务逻辑
三、结合轻量级NLP工具(适配灵活句式)
如果你的规则句式不固定,需要处理更灵活的自然语言表达,可以用NLP工具来提取语义信息:
- 用spaCy或NLTK(Python)做实体识别和关系提取,精准定位句子里的变量、比较关系、操作动作,再转换成代码
- 要是场景更复杂,还可以用轻量级大语言模型(比如LLaMA的小型版本、DistilGPT)来做文本到代码的生成,给模型喂几个示例就能输出符合要求的代码
关于其他语言的实现
完全可以用其他编程语言实现,核心思路是通用的:
- Java:用字符串处理+正则拆分句子,或者集成Drools这类规则引擎
- JavaScript/TypeScript:写字符串解析函数,或者用
natural这类NLP库辅助处理 - C#:利用.NET的文本处理能力,或者集成NRules规则引擎
给你补个Java的简单实现示例:
public class NaturalToCodeConverter { public static String convertToJavaCode(String naturalText) { String[] parts = naturalText.split(" "); String variable = parts[1]; String comparisonPhrase = parts[2] + " " + parts[3]; String value = parts[4]; String operation = parts[6]; java.util.Map<String, String> operatorMap = new java.util.HashMap<>(); operatorMap.put("more than", ">"); operatorMap.put("less than", "<"); operatorMap.put("equal to", "=="); String operator = operatorMap.getOrDefault(comparisonPhrase, "=="); return String.format("if (%s %s %s) { %s; }", variable, operator, value, operation); } public static void main(String[] args) { System.out.println(convertToJavaCode("If salary more than 5000 do op1")); // 输出结果:if (salary > 5000) { op1; } } }
内容的提问来源于stack exchange,提问作者Petr Petrov




