我正在编写一个程序,它将根据某些特定规则对输入文本进行标记。我为此使用 C++。
规则
Letter 'a' should be converted to token 'V-A'
Letter 'p' should be converted to token 'C-PA'
Letter 'pp' should be converted to token 'C-PPA'
Letter 'u' should be converted to token 'V-U'
这只是一个示例,实时我有大约 500 多个这样的规则。如果我将输入作为“ appu ”提供,它应该像“ VA + C-PPA + VU ”一样标记化。我已经实现了一个算法来做到这一点,并想确保我做的是正确的事情。
算法
所有规则都将保存在一个 XML 文件中,并具有到令牌的相应映射。就像是
<rules>
<rule pattern="a" token="V-A" />
<rule pattern="p" token="C-PA" />
<rule pattern="pp" token="C-PPA" />
<rule pattern="u" token="V-U" />
</rules>
1 - 应用程序启动时,读取此 xml 文件并将值保存在“ std::map ”中。这将在应用程序结束之前可用(单例模式实现)。
2 - 迭代输入的文本字符。对于每个字符,查找匹配项。如果找到,变得更加贪婪并通过从输入文本中获取下一个字符来寻找更多匹配项。这样做,直到我们得到一个不匹配。因此,对于输入文本“ appu ”,首先查找“ a ”的匹配项。如果找到,请尝试通过从输入文本中获取下一个字符来获得更多匹配。所以它会尝试匹配 ' ap ' 并没有找到匹配项。所以它只是返回。
3 - 替换输入文本中的字母“a”,因为我们得到了它的标记。
4 - 对输入文本中的剩余字符重复步骤 2 和 3。
下面是更简单的步骤说明
input-text = 'appu'
tokens-generated=''
// First iteration
character-to-match = 'a'
pattern-found = true
// since pattern found, going recursive and check for more matches
character-to-match = 'ap'
pattern-found = false
tokens-generated = 'V-A'
// since no match found for 'ap', taking the first success and replacing it from input text
input-text = 'ppu'
// second iteration
character-to-match = 'p'
pattern-found = true
// since pattern found, going recursive and check for more matches
character-to-match = 'pp'
pattern-found = true
// since pattern found, going recursive and check for more matches
character-to-match = 'ppu'
pattern-found = false
tokens-generated = 'V-A + C-PPA'
// since no match found for 'ppu', taking the first success and replacing it from input text
input-text = 'u'
// third iteration
character-to-match = 'u'
pattern-found = true
tokens-generated = 'V-A + C-PPA + V-U' // we'r done!
问题
1 - 这个算法看起来很好解决这个问题还是有更好的方法来解决这个问题?
2 - 如果这是正确的方法,std::map 是一个不错的选择吗?还是我需要创建自己的键/值容器?
3 - 是否有可以像上面一样标记字符串的库?
任何帮助,将不胜感激
:)