1

我有一个庞大的词汇数据库(约 2700 个条目)。每行包含一个英文单词、对应的日文单词以及与此问题无关的其他数据。我创建了一个工具来搜索并在表格中显示结果,但是我在使用furigana时遇到了一个小问题。

日语句子是由汉字(汉字)和拼音文字(假名)混合而成的。不是每个人都能读懂每一个汉字,有时同一个汉字有多种读法。在这些情况下,假名放在汉字上方- 这称为假名

在此处输入图像描述

我使用 <ruby> 标记以下列格式将这些语音读数呈现给用户:

<ruby>
  <rb>勉強</rb>    <!-- the kanji -->
  <rp>(&lt;/rp>      <!-- define where the phonetic part starts in the string -->
    <rt>べんきょう&lt;/rt>   <!-- the phonetic kana itself -->
  <rp>)&lt;/rp>      <!-- define the end of the phonetic part -->
</ruby>する        <!-- the last part is already phonetic so needs no ruby -->

字符串存储在我的数据库中,如下所示:

勉強(べんきょう)する

括号之间的任何内容都是紧接在它前面的汉字的读数。以这种方式存储字符串允许不支持 ruby​​ 标签的浏览器(例如,令人惊讶的 Firefox)回退。

所有这些都很好,但是当用户搜索时问题就来了。如果他们搜索

勉強

然后它就会出现。但如果他们试图寻找

勉強する

它不会起作用,因为在数据库中有一个字符串定义了中间的语音发音。

上例中的全角括号仅用于表示该拼音文字。鉴于此,我正在寻找一种方法来基本上告诉 MySQL 搜索忽略它在圆括号之间找到的任何内容。我对如何在 MySQL 中进行最简单的查询有基本的了解,但我当然不是专家。我查看了文档,但是(至少对我而言)它们不是很友好。也许对初学者不太友好。我认为某种涉及正则表达式的构造可能是可能的,但我不知道如何。

有没有办法做我想做的事?

4

2 回答 2

1

我建议不要使用 LIKE 查询,因为您必须在每个字符之间有一个 % (因为您不知道何时会出现假名)并且最终可能会产生误报(例如,如果有效字符出现在勉和强之间)。

正如@Jill-Jênn Vie 简要提到的那样,我建议添加一个新列来保存带有假名的文本。

我正在开发一个对韩文文本执行搜索的应用程序。问题是韩语变位改变了字符。例如:

하다 + 아요 = 해요

“하다”是字典形式的动词“to do”,“아요”是标准的礼貌形式变位。想必你会说日语,所以你知道这种礼貌形式有多普遍!注意 하 如何变为 해。显然,如果用户尝试在字符串“해요”中搜索“하다”,他们将找不到。但是如果用户想在语料库中看到“하다”的所有实例,我们需要能够返回它。

我们的解决方案是两列:“form”(共轭形式)和“analytic_string”,将“해요”表示为“하다+아요”。您可以采用类似的方法并制作第二列,其中包含您的句子而没有假名。

这种方法的主要缺点是您实际上将数据库大小增加了一倍,并且在输入两列具有相同数据的数据时需要特别注意(我在我的数据库中发现了几行表格和分析字符串其中有不同的词)。优点是您可以轻松搜索数据,同时忽略假名。

这是您的标准“尺寸与性能”权衡。哪个更重要:数据库大小还是执行时间?我能想到的任何其他解决方案都涉及返回太多行,然后单独分析它们。

于 2012-05-27T01:31:21.563 回答
1

如何在 MySQL 中进行正则表达式替换?,似乎没有用户定义的函数是不可能的(只能替换显式序列)。

相当肮脏的解决方案:您可以容忍两个连续日文字符之间的任何内容,LIKE '勉%強%す%る'. 我从来没有建议过。

或者,您可以在表中保留一个可选字段,该字段可能包含带有furigana的版本。

于 2012-05-27T01:11:12.830 回答