如果我知道所有的句子发音,怎么用句子来发音?

时间:2013-09-23 05:54:07

标签: string algorithm

这里是例如。
起源句子:小さくとも健気で美しい月が
发音:しょうさくともけなげでびしいつきが

我想得到汉字的解释,就像下面的

小:しょう
健気:けなげ
美:び
月:き

我认为LCS是获得它的算法之一,但它认为有时由于连续的平假名可能会失败,所以有没有更好的算法来解决这个问题?

justhal是对的,让我们将原始句子和发音句子视为字符串,所以我想要做的是将汉字与代词相匹配。

3 个答案:

答案 0 :(得分:1)

//警告:请注意,我不是日语专家,而且还在学习它。

据我所知,这个问题不能通过计算机算法在有或没有字典的情况下100%可靠地解决。我建议放弃。或者使用字典进行非完美的方法(字典优于没有字典)

最重要的部分是汉字不是西方字母。汉字是与概念/概念相关联的符号,概念组合在一起指向某个具有与之关联的(可发音)单词的对象。现在,汉字有常用读数列表(“on”/“kun”),但也有例外。

您的问题转化为:“给定的通配符序列与字母混合,将每个通配符与给定字符串中的字母序列匹配”。

示例:

猫に九生あり.-> +に++あり。

以下是您遇到的困难。

  1. 你不能明确地将发音分成与某个汉字相关的部分。对于像会社(かいしゃ)之类的简单事情你可以通过技术来识别映射到音节的有效字母序列(你不能将しゃ分成两个不同的部分),但是你最终会遇到有多个部分或有特别的阅读。示例:木阴(こかげ)哪个字母属于哪个汉字?
  2. 单词/短语的模糊分词。即粒子可以是阅读的一部分。物の怪“もののけ”现在,出于那两个“不”的,哪一个属于哪个汉字?
  3. 姓名和程式化的外来词。前两个例子可以用字典解决。名字需要特殊字典(一树读作“kazuki”,虽然一个没有“kazu”作为其“on”或“kun”阅读)。另一个很好的例子是来自死亡笔记的Yagami Light,外国单词“Light”(ライト)写为月(月/月,通常读作つき/げつ)显然,月不读作“光”。至于外国单词,“Slayers”中的火炎球发音(由主角)发音为“フャイヤーボール”(英语中的“火球”),但显然汉字没有那些读数。
  4. 这些问题不能通过算法明确处理,因此没有匹配字符串的算法。由于#2,LCS和类似的例程将导致错误的拆分。

    要使用字典,您可以使用edictkanjidic中的数据,但这并不能保证完美的解决方案。您可能还想调查“mecab”项目。

    - 编辑 -

      

    我认为LCS是获得它的算法之一,但它认为有时由于连续的平假名可能会失败,所以有没有更好的算法来解决这个问题?

    你不能这样解决。如果您只想将短语分成单词,则需要加载字典(15+兆字节的数据)并根据字典检查单个单词,此外,您还必须处理动词形式以在字典中查找单词。简单的通配符匹配在这里不起作用。

答案 1 :(得分:1)

这似乎是一个比LCS更简单的问题,因为句子中的每个平假名必须出现在发音中。

让我们在句子中将一串平假名称为“h-string”。

如果句子中的h字符串与发音中的只匹配一个子字符串,那么我们可以分解问题。例如,这个:

[小* さくとも *健気で美しい月が]< => [しょう* さくとも *けなげでびしいつきが]

成为这个:

[小]< => [しょう]
[健気で美しい月が]< => [けなげでびしいつきが]

在这个例子中,这个过程就足够了,因为没有歧义;每个h-string在发音中只出现一次。我们必须考虑更难的案例。

我将用罗马字符替换平假名和汉字的序列,部分用于抽象,但主要是因为我不会说日语而不能用真正的日语句子作为例子。上一个例子变为:

[AwBCxDyEz]< => [swtxuyvz]

这容易发生故障:
一:■
BC:T
d:U
E:v

这个过程一直有效,直到我们遇到一个地图,其中所有的H字符串都是内部的,而且没有一个在发音中是唯一的:

[AyBzC]< => [yuzyvzyzwzyx]

现在我们必须考虑所有可能的匹配:

[余德耀的ý v 以Z yzwzyx]
[余德耀的ý vzy 以Z wzyx]
[余德耀的ý vzyzw 以Z YX]
[yuzyvz的ý ZW 以Z YX]

在这种情况下,算法必须报告{A,B,C}的4种可能发音。

答案 2 :(得分:-1)

我建议将汉字句子转换为正则表达式,如下所示:

regex = "(*)さくとも(*)で(*)しい(*)が"

所以你要将汉字的所有连续子串转换为(*)。然后将该正则表达式与发音字符串匹配:

pronunciation = "しょうさくともけなげでびしいつきが"

如果它产生肯定匹配,大多数正则表达式库将能够告诉你“第n组括号中的文本是什么”。只需找到一个可以让你这样做的正则表达式库;事实上,如果没有这种能力,找到一个正则表达式库可能会更难。