C 从电话数字键盘进行字母搜索

C 从电话数字键盘进行字母搜索,c,algorithm,nlp,state-machine,iphone-keypad,C,Algorithm,Nlp,State Machine,Iphone Keypad,我正在实现基于电话键盘的字母搜索,如电话键盘 当用户输入2时,我得到组合中的{A,B,C}。当用户输入23时,我得到组合中的{AD、AE、AF、BD、BE、BF、CD、CE、CF},依此类推。如果我继续打字和组合,我会得到成千上万的组合,这使得搜索过程相当缓慢。所以现在我想实现一个算法,删除不符合逻辑的组合,比如CF-BD-CD,我的意思是逻辑上没有人的名字是以这些组合开头的,可能是两个没有元音的辅音。所以,这样我想缩小我的搜索范围。任何了解这种用C语言实现的状态机的人?都可以根据正在搜索的数据

我正在实现基于电话键盘的字母搜索,如电话键盘


当用户输入2时,我得到组合中的{A,B,C}。当用户输入23时,我得到组合中的{AD、AE、AF、BD、BE、BF、CD、CE、CF},依此类推。如果我继续打字和组合,我会得到成千上万的组合,这使得搜索过程相当缓慢。所以现在我想实现一个算法,删除不符合逻辑的组合,比如CF-BD-CD,我的意思是逻辑上没有人的名字是以这些组合开头的,可能是两个没有元音的辅音。所以,这样我想缩小我的搜索范围。任何了解这种用C语言实现的状态机的人?

都可以根据正在搜索的数据集构建一组有效的前缀。将部分输入与之匹配应该非常容易。

您可以根据正在搜索的数据集构建一个有效前缀的集合。将部分输入与之匹配应该很容易。

请记住,当涉及语言数据时,“不合逻辑”并不能很好地代表“不可能”。当涉及名称时,尤其如此。例如,根据英语中“辅音”的标准定义,我的姓以四个辅音开头。如果它是按照德国的风格写的,它将以五开始。在考虑此类问题时,请记住:

  • 声音不是字母,字母也不是声音:在大多数情况下 在正交系统中,字母与声音的映射不是1:1
  • 许多语言都有意料之外的音节核心:例如,Tamazight Berber允许音节中的
    m
    起音节核的作用,就像英语中的元音一样。因此,柏柏尔语的名称可以看起来像
    CCmC
    (其中C代表辅音),并且在该语言中是完美的。柏柏尔血统的人不太可能使用类似的英语拼字法,天真的系统会将其排除在“不合逻辑”之外
  • 最后,许多用英语书写外国名字和单词的系统使用di图或tri图(两个字母和三个字母的组合)来表示英语中的外语发音:这可能会产生看起来像非法辅音群的东西。我们知道英语就是这样做的(
    sh
    代表一个声音,见第1点),但在转录外来词时尤其如此

  • 因此,除非你非常清楚你想要的名字的拼写规则,否则你很可能会用一个简单的系统来排除合法的名字。

    请记住,当涉及到语言数据时,“不合逻辑”并不是“不可能”的好代表。当涉及到名字时,这一点尤其正确。例如,根据英语中“辅音”的标准定义,我的姓以四个辅音开头。如果它是按照德国的风格写的,它将以五开始。在考虑此类问题时,请记住:

  • 声音不是字母,字母也不是声音:在大多数情况下 在正交系统中,字母与声音的映射不是1:1
  • 许多语言都有意料之外的音节核心:例如,Tamazight Berber允许音节中的
    m
    起音节核的作用,就像英语中的元音一样。因此,柏柏尔语的名称可以看起来像
    CCmC
    (其中C代表辅音),并且在该语言中是完美的。柏柏尔血统的人不太可能使用类似的英语拼字法,天真的系统会将其排除在“不合逻辑”之外
  • 最后,许多用英语书写外国名字和单词的系统使用di图或tri图(两个字母和三个字母的组合)来表示英语中的外语发音:这可能会产生看起来像非法辅音群的东西。我们知道英语就是这样做的(
    sh
    代表一个声音,见第1点),但在转录外来词时尤其如此

  • 因此,除非您非常了解所需名称的正交规则,否则可能会使用简单的系统排除合法名称。

    我想您可以根据实际数据集构建有效前缀的trie。在我看来,你应该把电话簿上的名字编码成这些号码,然后搜索这些号码。只需要精确的匹配,还是范围?如果搜索产生误报,这是一个问题吗?我想您可以根据实际数据集构建一个有效前缀的trie。在我看来,你应该把电话簿上的名字编码成这些号码,然后搜索这些号码。只需要精确的匹配,还是范围?如果搜索结果出现误报,这是一个问题吗?你知道有什么例子吗?请看博客没有那么难,你知道:@akavi_paracha你知道有什么例子吗?请看博客没有那么难,你知道:@akavi_paracha