我需要在C中实现一个用于短语匹配/短语识别的算法。具体来说,我有一个在循环中运行的函数,它输出以按字符串筛选一个单词。我将每个输出字放在一个缓冲区中。 我还有一个包含这样一组短语的文件:
短语1:早上好 [姓] [名字] 您的帐户中有 [金额] $。
短语2:会员 [姓氏] [名字] 从列表中选择 [选项] 。
因此我的集合中的短语具有已知形式,由固定部分和动态部分组成(在 [“”] 之间)。关于动态部分我只知道构成它的单词数量。例如,在短语2中,第一个动态部分有2个单词,第二个动态部分有一个单词。
由于我的缓冲区中填充了函数输出中的单词,我需要确定列表中的哪个短语与缓冲区匹配。
我需要一个关于算法的建议,如果已经有这样的算法可以使用,如果没有,那么在C中这样做的最佳方法是什么?
感谢。
答案 0 :(得分:1)
我会从像这样的字符指针的锯齿状数组开始
char *phrase1[] = { "Good", "morning", "Mr.", "", "", "you", "have", "", "$", "in", "your", "account.", NULL };
char *phrase2[] = { "Member", "", "", "has", "chosen", "", "from", "the", "list.", NULL };
char **phrases[] = { phrase1, phrase2, NULL };
在每个短语中都有
"morning"
""
NULL
指示短语使用数组时,phrases[p][i]
是短语p
中的第i个单词,
phrases[p][i][0]
是第{h = 1}}中第i个单词中的第一个字符。
因此,检查动态项目的代码是
p
检查短语的结尾
if ( phrases[p][i][0] == '\0' )
// this is a dynamic item
否则,要比较单词
if ( phrases[p][i] == NULL )
// this is the end of the phrase
答案 1 :(得分:0)
假设缺少的单词遵循已知的regex
模式,例如[\w\d]+
,您可以使用以下格式创建大正则表达式:
^(Good morning Mr. [\w\d]+ [\w\d]+ you have [\w\d]+ \$ in your account.)
|(Member [\w\d]+ [\w\d]+ has chosen [\w\d]+ from the list.)
|(...)$
然后将此正则表达式与输入匹配将告诉您哪个子表达式匹配,并且子表达式的索引匹配短语的索引。
这正是flex
内部的作用。所以另一种可能性是将匹配的短语作为正则表达式写在flex
文件中,并请求flex为您生成匹配器。