使用 Python 通过 5 个简单步骤预测下一个单词

使用Python构建下一词预测器

您可能注意到,在手机上输入文字时,它会自动预测您接下来可能要使用的词语。 这项功能旨在提高输入速度并节省您的时间。

它的便利性显而易见。 无论是发送短信、网络搜索还是撰写电子邮件,预测文本都能提供极大的帮助。 但您是否曾好奇过,手机是如何知道接下来应该建议哪些词语呢?

在本指南中,我将向您展示如何使用Python来创建单词预测功能。

为了更好地理解,具备自然语言处理(NLP)的基本知识将有所帮助。 如果您对此不太熟悉,请不必担心,您可以从我们之前的文章“NLP 简述”中快速了解基础知识,我们在其中对相关概念进行了简明扼要的解释。

下一词预测的应用

  • 下一词预测提高了移动设备上打字的速度和准确性,因此在短信和通讯应用中非常有用。
  • 搜索引擎使用预测文本来建议搜索查询,使用户可以更轻松地快速找到相关信息。
  • 它有助于自动更正拼写错误的单词,并减少在各种应用程序(包括文字处理器和电子邮件客户端)中的输入错误。
  • 开发人员和程序员在编写代码时会受益于预测文本,因为它会建议相关的函数、方法和变量名称。
  • 在线平台和流媒体服务使用预测文本向用户推荐相关内容。

现在,让我们一起开始学习这项有趣的NLP技术,深入了解它的用途,并清晰地完成每个步骤。

数据准备

首先,我们需要导入对项目至关重要的必要库。 之后,我们将定义用于训练的示例文本。 您可以将此文本替换为您选择的任何文本数据。

您还可以使用包含文本数据的数据集,这些数据集可以在Kaggle或类似平台上轻松找到。

    import nltk
    from nltk import ngrams
    from collections import defaultdict
    import random
  

以下是示例文本数据,将用于预测下一个单词。

    text = """
      在宁静而神秘的塞伦迪皮蒂小镇,一个星光闪耀的夜晚,一位名叫阿米莉亚的好奇的年轻探险家开始了一场非凡的冒险。
      她手持可靠的放大镜,怀着不屈不挠的精神,踏上了一段旅程,去寻找隐藏在迷宫森林深处难以捉摸的极乐宝藏。
      当她穿梭于翠绿的树林时,阿米莉亚遇到了一只古怪的、会说话的松鼠,名叫珀西瓦尔,它用谜语说话,并引导她走向宝藏所在的地方。
      森林里到处都是生物发光的植物,用万花筒般的色彩照亮了她的道路。
      阿米莉亚很快来到一个悬崖边,俯瞰着一个令人敬畏的、天蓝色的瀑布,它奔腾的水声回荡着悠扬的夜曲。
      在瀑布旁边,矗立着一块巨大的、长满苔藓的石头,上面刻着神秘的铭文。
      在珀西瓦尔的指导下,她破译了古老的符文,并发现了通往宝藏的入口。
      在里面,她发现了一个华丽的箱子,上面装饰着错综复杂的金色细丝。
      打开它后,一首闪烁的珠宝、光彩夺目的宝石和闪闪发光的人工制品的交响曲以空灵的光芒迎接她。
      极乐的宝藏是她的了,这是她无畏的勇气和永不满足的好奇心的证明。
      阿米莉亚回到塞伦迪皮蒂后,受到了欢快的庆祝,她非凡的旅程成为一个传奇,激励其他人踏上他们在奇妙的想象和发现领域的冒险。
      """
  

您可以根据您的需要替换此文本。

分词

我们将预处理我们的文本并将其标记化。标记化是将文本分解为单个单词或标记的过程。我们使用Python中的nltk库来标记我们的文本。

为了确保我们的模型专注于单词并忽略大小写或标点符号,我们执行预处理。此步骤涉及将所有单词转换为小写并删除所有标点符号。

    import nltk
    words = nltk.word_tokenize(text)
    words = [word.lower() for word in words if word.isalnum()]
    words
  

经过预处理和标记化后,我们将得到所有小写且不带标点符号的单词。

标记化后的单词

构建 N 元语法

在此步骤中,我们将创建N元语法,它是自然语言处理(NLP)中N个单词的序列。

在我们的代码中,我们将创建二元模型,其中N等于2,这意味着每个N元模型将由单词对组成。

这是构建下一个单词的预测模型的基本步骤,因为它允许我们分析单词序列,并根据前N-1个单词提供的上下文来预测下一个单词。

    N = 2
    ngrams_list = list(ngrams(words, N))
    ngram_freq = defaultdict(int)
    for ngram in ngrams_list:
      ngram_freq[ngram] += 1
  

这些N元语法作为训练和实现我们的下一个单词预测模型的构建块。

定义函数

在此步骤中,我们创建一个名为“predict_next_word”的函数,该函数根据提供的前缀(单词序列)猜测句子中的下一个单词。

该函数在下一个单词预测模型中至关重要,因为它采用前缀提供的上下文,并使用它来预测最可能的下一个单词。

我将用简单的话解释这个过程中发生的事情:

  • 该函数查看文本数据中以提供的前缀(缺失单词之前的单词)开头的所有单词对(二元组)。
  • 它计算每个单词在这些对中出现的频率,并按频率从最常见到最不常见对它们进行排序。
  • 然后,该函数建议将最常出现的单词作为给定前缀之后的下一个单词。
    def predict_next_word(prefix):
        matching_ngrams = [(ngram, freq) for ngram, freq in ngram_freq.items() if ngram[:-1] == prefix]

        if not matching_ngrams:
            return "No prediction available."
        sorted_ngrams = sorted(matching_ngrams, key=lambda x: x[1], reverse=True)
        prediction = sorted_ngrams[0][0][-1]
        return prediction
  

它是下一个单词预测模型的关键部分,因为它允许我们为给定文本序列中的下一个单词生成上下文相关的建议。

测试

此代码允许您使用自己的输入测试模型。 您输入几个单词,按Enter键,模型就会预测下一个单词。如果您输入无效内容,它会要求您重试。

    user_input = input("Enter a prefix for next-word prediction: ").lower().split()
    if len(user_input) != N - 1:
      print("Please enter a valid prefix.")
    else:
      prefix = tuple(user_input)
      prediction = predict_next_word(prefix)
      print(f"Next word prediction: {prediction}")
    

我们的代码将创建这种接口。您可以在其中写入前缀并按Enter键。

输入前缀

输入回车后,您会得到下一个单词

预测词

这是一种演示如何在实践中使用下一个单词预测模型的方法。

挑战:

  • 下一个单词预测的准确性在很大程度上取决于训练数据的大小和质量。有限或嘈杂的数据可能会导致预测不太准确。
  • 如果输入文本中的某个单词在训练数据中不存在,则无法准确预测。
  • 标点符号可能会影响预测准确性,尤其是在英语等语言中,单词边界可能不明确。
  • 不正确的标记化或预处理可能会导致错误的预测。
  • 许多单词具有多种含义,上下文可能并不总是能够消除它们的歧义。

如何提高准确性

  • 使用更大、更多样化的数据集可以提高模型对各种上下文和单词的理解。
  • 考虑使用高阶N元语法(例如三元语法)来获取更多上下文,但要与数据可用性进行平衡。
  • 收集用户反馈并根据实际使用情况不断改进模型。
  • 使用适当的指标定期评估模型的性能并相应地调整策略。
  • 您可以实现基于神经网络的模型,例如LSTM或Transformer,以进行更复杂的上下文建模。

最后的话

在自然语言处理领域,预测下一个单词是一项宝贵的技能。通过这5个简单的Python步骤,您已经获得了一个强大的工具,可以实现更快的通信和更智能的技术。

不断探索和使用这些知识来增强您的语言体验。旅程才刚刚开始!

您还可以探索一些使用Python从URL下载文件的最佳方法。