如何使用用户定义的词典实时翻译用户输入


How do I translate user input in real-time with a user-defined dictionary?

我正在尝试使用PHP将用户输入实时翻译成他们定义的语言。

例如,用户创建以下字典(左手边是输入,右手边是输出):

[
    "A" => "alpha",
    "B" => "bravo",
    "CD" => "charlie delta"
]

然后,用户输入以下内容(有关详细信息,请参阅下面的EDIT):

"A", "B", "C", "D"

如何实时翻译这些输入:

|-------------|---------------------------------|
| input       | output                          |
|-------------|---------------------------------|
| "A"         | "alpha"                         |
| "A" + "B"   | "alpha" + "bravo"               |
| "AB" + "C"  | "alpha bravo" + ?               |
| "ABC" + "D" | "alpha bravo" + "charlie delta" |
|-------------|---------------------------------|

如果输入字符串和输出字符串之间是一对一的关系,就不会有问题。但是,多个输入字符串可能与单个输出字符串相关(例如,"CD"是"charlie delta")。

可能的解决方案

我考虑过将输入字符串标记为n-grams,其中n是用户字典中单个输出的最大输入数(在上面的示例中,由于"CD",n-将为2)。

类似这样的算法:

  1. 用户输入"A"
  2. 我标记输入字符串:

    |--------|---------|
    | tokens | hits    |
    |--------|---------|
    | "A"    | "alpha" |
    |--------|---------|
    
  3. 我输出"阿尔法"
  4. 用户将"B"附加到输入字符串("A"+"B")
  5. 我将新的输入标记为二元图:

    |--------|--------|
    | tokens | hits   |
    |--------|--------|
    | "B"    | "beta" |
    | "AB"   |        |
    |-----------------|
    
  6. 我将"beta"附加到输出字符串("alpha"+"beta")
  7. 用户将"C"附加到输入字符串("AB"+"C")
  8. 我将新的输入标记为二元图:

    |--------|--------| 
    | tokens | hits   |
    |--------|--------|
    | "C"    |        |
    | "BC"   |        |
    |-----------------|
    
  9. 我不在输出中附加任何内容,因为没有命中
  10. 用户将"D"附加到输入字符串("ABC"+"D")
  11. 我将新的输入标记为二元图:

    |--------|-----------------| 
    | tokens | hits            |
    |--------|-----------------|
    | "D"    |                 |
    | "CD"   | "charlie delta" |
    |--------------------------|
    
  12. 我将"charlie delta"附加到输出字符串("alpha bravo"+"charlie德尔塔")

当然,n-grams随着可能的输入数量而增长。有没有我看不到的更简单或更快的解决方案?

编辑2015年3月19日:

用户的词典可能涉及数以万计的术语。所以,我把它存储在数据库中。我还将输出存储在数据库中以备将来使用。

在前端,用户在文本输入中输入他们的输入,输入的值通过后台的AJAX请求发送到PHP。

例如。。。

  1. 用户在文本输入中输入"A"
  2. 按下键后,Javascript获取文本输入的值,将其发送到后台的服务器,并清除输入的值
  3. 用户在文本输入中输入"B"
  4. 按下键后,Javascript捕获文本输入的值,将其发送到后台的服务器,并清除输入的值
  5. 。。。等等

我可能会收集文本输入,每隔30秒左右发送一次,以便在服务器上进行处理,这样请求就不会开始堆积,但你已经明白了。

PHP对这个应用程序来说不是一个好主意。PHP是一种服务器端技术,这意味着每次你想让它解释和更改输入的值时,你都必须触发一个提交。唯一可行的方法是让用户完成条目(填写整个字段)将其提交给服务器,对其进行字符串拆分、解析和替换,然后通过页面刷新返回值。用户界面不是很好。

出于这个原因,您几乎肯定会想要使用Javascript。

在javascript中,这并不十分困难。您必须定义您的转换列表,很可能是通过从服务器获取转换列表的ajax调用。您可以将结果数据分配给一个对象,您可以对该对象进行查找以获取值。您可以在输入字段上创建一个keyup或change事件,在该事件中,您可以评估输入,确定定义对象的输出,并将其返回到另一个字段。