命名实体的Python自然语言处理

命名实体的Python自然语言处理,python,nlp,Python,Nlp,我正在编写一个pythonweb应用程序,其中需要处理包含命名实体的搜索查询。例如 如果搜索查询为: “mac os lion” 假设我必须使用数据库中可用的候选人处理此查询: 谷歌安卓 微软视窗 苹果MacOSX狮子 我们都知道第三个结果是正确的。但我们有没有办法将用户的查询,即“mac os lion”映射到“Apple mac os X lion”(这是我数据库中可用的条目) 有人能告诉我要查找什么或做什么吗。如果您只需要查找与查询类似的文本,您可以使用带有python绑定的文本搜索

我正在编写一个pythonweb应用程序,其中需要处理包含命名实体的搜索查询。例如 如果搜索查询为: “mac os lion” 假设我必须使用数据库中可用的候选人处理此查询:

  • 谷歌安卓
  • 微软视窗
  • 苹果MacOSX狮子
我们都知道第三个结果是正确的。但我们有没有办法将用户的查询,即“mac os lion”映射到“Apple mac os X lion”(这是我数据库中可用的条目)
有人能告诉我要查找什么或做什么吗。

如果您只需要查找与查询类似的文本,您可以使用带有python绑定的文本搜索引擎,例如

您需要对用户查询进行某种规范化,并且必须“学习”从这些查询到正确“类”的映射

一种简单的方法是计算匹配任何“类”的“标记”的重叠。以下示例代码可能会有所帮助:

CLASSES = ['Google Android', 'Microsoft Windows', 'Apple Mac OS X Lion']

def classify_query(query_string):
    """
    Computes the most "likely" class for the given query string.

    First normalises the query to lower case, then computes the number of
    overlapping tokens for each of the possible classes.

    The class(es) with the highest overlap are returned as a list.

    """
    query_tokens = query_string.lower().split()
    class_tokens = [[x.lower() for x in c.split()] for c in CLASSES]

    overlap = [0] * len(CLASSES)
    for token in query_tokens:
        for index in range(len(CLASSES)):
            if token in class_tokens[index]:
                overlap[index] += 1

    sorted_overlap = [(count, index) for index, count in enumerate(overlap)]
    sorted_overlap.sort()
    sorted_overlap.reverse()

    best_count = sorted_overlap[0][0]

    best_classes = []
    for count, index in sorted_overlap:
        if count == best_count:
            best_classes.append(CLASSES[index])
        else:
            break

    return best_classes
示例输出

classify_query('mac OS x') -> ['Apple Mac OS X Lion']
classify_query('Google') -> ['Google Android']
当然,这只是一个非常基本的解决方案。您可能希望添加一些拼写检查,以便在查询字符串中出现拼写错误时更加可靠


希望有帮助:)

我也在维基百科上寻找解决方案。我可以跨越最小的编辑距离。最小编辑距离应用于单个字符。我应该做的是使用标记而不是字符应用相同的概念。顺便说一句,谢谢你的回答。例如,你可以在字符串上使用Levenshtein距离,以允许标记中存在一定数量的“打字错误”。很乐意帮忙。有什么理由不接受我的答案吗?其实这两个答案都很有帮助。事实上,当我看到我的答案时,我发现它更适合我的项目。但对于我在这里问的问题,你的回答更合适。所以我想我应该接受你的回答。我认为应该有接受多个答案的规定。非常感谢你抽出时间。你真好。