zoukankan      html  css  js  c++  java
  • 语料切词算法研究

    语料切词算法研究

    1,语料切词需求

    实际工程中,常有将文字转为语音播放的需求。比如车辆进场时播放“京B123Y5欢迎光临”,车辆离场时播放“请缴费15元,一路顺风”等。

     

    语料指基础的语音材料,是控制系统提供的可播放的语音片段。语料库一般包括:单个的字母数字、使用汉字、常用的词语组合如“欢迎光临”、“一路顺风”等。如下表:

    语音索引号

    语音内容

    0

    0

    1

    1

    。。。

     

    9

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    欢迎光临

    19

    一路平安

    20

    此卡

    21

    已过期

    22

    无效

    23

    有效

    24

    有效期

    。。。

     

    37

    A

    38

    B

    。。。

     

    61

    Y

    62

    Z

    63

    64

    。。。

     

    96

    97

    。。。

     

    101

    请缴费

    102

    103

    。。。

     

    112

    113

    114

    谢谢

    115

    欢迎回家

    。。。

     

    161

    欢迎

    162

    泊车

    163

    一路顺风

    。。。

     

    1,语料库

     

    比如,要播放“京B123Y5欢迎光临”,按照上述语料库,分别对应:京à63Bà381à12à23à3Yà615à5,欢迎光临à18,就需要按顺序传递“语音索引号”参数列表:63381,2,3,61,5,18

     

    本文研究对于给定的语料库,输入任意文字字符串,如何高效转换为语料库中对应的“语音索引号”列表。

     

    显然,要实现上述需求,就要对输入的文字串进行切分(即切词),同时切分之后的各部分片段应满足以下要求:

     

    1)        尽可能多地对应于语料库元素,即无法读出的片段尽量少

    2)        优先采用语料库中较长元素,使语音读出更加自然。如,假设语料库中有“有效期”、“有效”、“期”三种元素,那么切词应将“有效期”切为一个词,而不是切为“有效”、“期”2个词。

    3)        计算速度尽可能快,耗用CPU和内存尽可能少。

    2,基本思路

    首先,由于切词的位置和长度不确定,造成切词结果的可能性组合非常大。如输入一个20字符的句子,对于一个语料长度最多10字符的1000条语料库来说,完全的匹配计算次数为:

    1000*10^20次。参照主流PC机每秒100亿次浮点运算的能力,需要时间为10^13秒。而一般实际要求均需要毫秒级反馈,因此采用有效算法进行查找十分必要。

     

    有效算法依赖于有效的查找表,构建一个适合顺序查找的“语料查找表(PLT)”很有必要。以下为构建要点:

    1)        基于语料库

    2)        按语料栏位排序,而不是按索引号排序

    3)        为满足“要求3“,应从第一个字符开始比对和定位,因此对于语料库中不存在首单字索引的语料,要增加“虚拟”语料。如语料库中有“欢迎”一词,但没有“欢”这个字,就增加一条语料“欢”,其索引为 -1,表示不存在。

    4)        扩展PLT栏位:除了语音元素(语料)、索引号以外,增加长度、标记。

    a)         长度为语音元素的字节数。如A长度为1,“欢迎光临“长度为8

    b)        标记为语料查找提供提示。详见第5条。

    5)        为满足“要求2“,在已经查找到语料时,应继续向后查找,看看是否能匹配到更长的语料。假设第L条语料的语音元素为YL),若Y(L)不包含在Y(L+1)中,则不必向后查找,此时第L条语料的“标记”栏位设置为0;否则设置为1,其后凡包含Y(L)的语料,设置“标记”栏位为2.

    3,编制“语料查找表(PLT)”

    语料查找表(PLTPart Lookup Table)编制原理如上,具体编制过程可编程实现。

    如下是依据“表1,语料库”实现的一个PLT

     

    语音元素

    长度

    标记

    索引号

    0

    1

    0

    0

    1

    1

    0

    1

    。。。

     

     

     

    9

    1

    0

    9

    A

    1

    0

    37

    B

    1

    0

    38

    。。。

     

     

     

    Y

    1

    0

    61

    Z

    1

    0

    62

    2

    0

    152

    2

    0

    11

    。。。

     

     

     

    2

    1

    133

    成功

    4

    2

    30

    2

    0

    77

    。。。

     

     

     

    2

    1

    -1

    光临

    4

    2

    165

    2

    1

    -1

    欢迎

    4

    2

    161

    欢迎光临

    8

    2

    18

    欢迎回家

    8

    2

    115

    2

    1

    -1

    及时

    4

    2

    186

    。。。

     

     

     

    2

    1

    -1

    按临时车计费

    12

    2

    204

    2,语料查找表(PLT

    4,基于“语料查找表”的切词算法

    输入:InSentence字符串

    1)        N=0

    2)        N=n+1

    3)        N>length(InSentence)? 若是,结束算法;否则继续4

    4)        InSentenceN个字节ByteN

    5)        ByteN是否在为0-9A-Z之间?若是,则转100;否则转3

    6)        N=n+1

    7)        InSentenceN个汉字符CharN

    8)        PLT中查找长度为2的元素,是否有匹配M?若无,转2;若有,转9

    9)        记录下M的索引为Idx,标记为F

    10)     F是否为0?若是,转100;若否,转11

    11)     M=M+1

    12)     记录M的标记是否为2?若否,转200;否则转13

    13)     M的长度为L,语音元素为CharM 索引号为IdxM

    14)     InSentence长度为L的字符串与CharM比对是否一致。

    15)     若一致,则N=n+L,将索引号IdxM,加入结果集,转2;否则转11

     

    100)PLT中查找ByteN的索引号Idx,加入结果集,转2

     

    200)将索引号Idx,加入结果集,转2

    5,算法测试


     

    输入:你好AB请等待欢迎回来请及时缴费

    返回:,-1,113,37,38,98,161,-1,-1,155,186,174

     

    语料切词表如下:

    语料切词

    语料索引

    -1

    113

    A

    37

    B

    38

    请等待

    98

    欢迎

    161

    -1

    -1

    155

    及时

    186

    缴费

    174

     

    可见,除了语料库中不存在的“你”、“回”、“来”这3个词以外,其余输入均进行了正确切分,算法实现了语料切词的3条需求。

     

  • 相关阅读:
    HDU4289 Control 最大流
    POJ3281 Dining 最大流
    HDU4738 Caocao's Bridges 无向图的桥
    HDU4865 Prince and Princess 强连通分量+二分图判定
    POJ 1904 King's Quest 强连通分量+二分图增广判定
    HDU 4635 Strongly connected 强连通分量
    HDU 4280Island Transport(Dinc非STL 模板)
    POJ 2752Seek the Name, Seek the Fame(next数组妙用 + 既是前缀也是后缀)
    Codeforces Round #346 (Div. 2)E
    POJ2318TOYS(叉积判断点与直线位置)
  • 原文地址:https://www.cnblogs.com/jackkwok/p/10131851.html
Copyright © 2011-2022 走看看