-1

拼写错误的问题:当您使用用户输入制作应用程序时,您可能会遇到错误的输入。有可用的拼写检查库来处理它们,但是用户定义的数据可能不存在于字典中。例如,您正在构建一个聊天机器人,您需要在其中输入位置名称来搜索餐厅。

4

1 回答 1

1

数据库层解决方案:

要处理此问题,您可以使用 soundex API。这些是在所有技术中作为小型库可用的标准 API。它们也可用于数据库 SQL 查询。

下面是 MySQL 数据库的有效 SQL 查询之一: select distinct r_name from restuarant where area = 'South' and SOUNDEX(cost) = SOUNDEX('cheep')

在上面的例子中,数据库可能有“便宜”的条目,但用户输入了“便宜”。所以上面的查询将返回 cost = 'cheap' 的有效记录。

python层中的解决方案:

Fuzzy 库有 Soundex 和 DMetaphone API。

  1. 设置模糊的步骤:

    一个。确保您已安装 python3 并在 PATH 'C:\Program Files\Python36\Scripts' 中设置

    湾。从https://pypi.python.org/pypi/Fuzzy下载 Fuzzy-1.2.2.tar.gz 库

    C。将它们提取到一个文件夹中。

    d。执行 setup.py 安装

  2. 在python中导入和测试:

    进口模糊

    dmtfn = 模糊.DMetaphone(4)

    打印(dmtfn('海得拉巴'),dmtfn('海得拉巴'))

    >> [b'HTRP', None] [b'HTRP', None]
    

    打印(dmtfn('海得拉巴')[0],dmtfn('海得拉巴')[0])

    >> b'HTRP' b'HTRP'
    

一个真实的用例(聊天机器人中的实体提取器):

当您为餐厅搜索构建聊天机器人时,您必须找到一个有效位置,该位置被预定义为实体列表。所以用户输入的位置在被传递到数据库之前应该被识别为python层中的一个实体。在这种情况下,我们可以使用 soundex ot dmetaphone api。

下面的代码片段,从文件夹中读取实体(所有位置都可以在文件 city.txt 中),然后创建有效的实体列表。然后将实体列表转换为有效的 DMetaphone 代码。最后输入位置将被转换为 DMetaphone 代码并与之前创建的代码进行比较。

    # read all entities from the entities folder
    # store them as dictionary, where key is filename
    files = os.listdir('./entities/')
    entities = {}
    for fil in files:
        lines = open('./entities/'+fil).readlines()
        for i, line in enumerate(lines):
            lines[i] = line[:-1]
        entities[fil[:-4]] = '|'.join(lines)

    # now convert the valid entities into codes
    if ' ' in uinput:
        codes = [dmtfn(w)[0] for w in uinput.lower().split()]
    else:
        codes = [dmtfn(uinput.lower())[0]]

    # If the code of input location matches with valid code list
    # then store the location as valid attribute for the intent
    for entity in entities:
        for i in entities[entity].split('|'):
            # entity extraction using sound code, to avoid spell mistakes
            # using soundex in database layer
            currCode = dmtfn(i.lower())[0]
            # print(currCode, i.lower())
            if currCode in codes:
                # if i.lower() in uinput.lower():
                attributes[entity] = i 
于 2018-04-08T19:36:57.173 回答