使用 Python 进行文本分词

PythonBeginner
立即练习

介绍

在这个项目中,你将学习如何使用 Python 实现一个文本分词系统。文本分词是自然语言处理中的一项基础任务,它将给定的文本分解为称为词元(token)的较小单元。这些词元可以表示文本中的单词、数字、标点符号或其他有意义的元素。对文本进行分词的能力对于许多应用来说至关重要,比如编译器中的词法分析、情感分析和文本分类。

👀 预览

## text = 'total = 1 + 2 * 3'

tokens = [Token(type='NAME', value='total'), Token(type='WS', value=' '), Token(type='EQ', value='='), Token(type='WS', value=' '), Token(type='NUM', value='1'), Token(type='WS', value=' '), Token(type='ADD', value='+'), Token(type='WS', value=' '), Token(type='NUM', value='2'), Token(type='WS', value=' '), Token(type='MUL', value='*'), Token(type='WS', value=' '), Token(type='NUM', value='3')]

🎯 任务

在这个项目中,你将学习:

  • 如何定义一个Token类来表示文本中的词元
  • 如何实现一个generate_tokens函数,该函数接受输入文本并生成词元流
  • 如何使用示例文本测试分词过程

🏆 成果

完成这个项目后,你将能够:

  • 理解文本分词的概念及其在自然语言处理中的重要性
  • 使用 Python 实现一个基本的文本分词系统
  • 通过定义不同的词元类型及其相应的正则表达式来自定义分词过程
  • 使用各种输入文本测试和调试分词系统

定义词元类

在这一步中,你将学习如何定义Token类,它将表示文本分词过程中的词元。

  1. 在文本编辑器中打开/home/labex/project/texttokenizer.py文件。

  2. 在文件开头,从collections模块导入namedtuple函数:

    from collections import namedtuple
  3. Token类定义为一个具有两个属性的具名元组:typevalue

    Token = namedtuple("Token", ["type", "value"])
✨ 查看解决方案并练习

实现 generate_tokens 函数

在这一步中,你将实现 generate_tokens 函数,该函数将接受输入文本并生成一系列词元。

  1. texttokenizer.py 文件中,定义 generate_tokens 函数:

    def generate_tokens(text):
        ## 定义词元类型及其对应的正则表达式
        token_specification = {
            "NAME": r"[a-zA-Z_][a-zA-Z_0-9]*",
            "NUM": r"\d+",
            "ADD": r"\+",
            "SUB": r"-",
            "MUL": r"\*",
            "DIV": r"/",
            "EQ": r"=",
            "WS": r"\s+",
        }
    
        ## 将正则表达式组合成一个大的正则表达式
        regex = "|".join("(?P<%s>%s)" % pair for pair in token_specification.items())
    
        scanner = re.finditer(regex, text)
        for m in scanner:
            type = m.lastgroup
            value = m.group()
            yield Token(type, value)
  2. generate_tokens 函数首先定义一个字典 token_specification,将词元类型映射到它们相应的正则表达式。

  3. 然后,它使用 | 运算符将所有正则表达式组合成一个单一的大正则表达式。

  4. 该函数接着使用 re.finditer 函数在输入文本中找到所有匹配项,并为每个匹配项生成一个 Token 对象,包含词元类型和值。

✨ 查看解决方案并练习

测试分词

在这一步中,你将通过解析一个示例文本来测试 generate_tokens 函数。

  1. texttokenizer.py 文件末尾,添加以下代码:

    if __name__ == "__main__":
        text = "total = 1 + 2 * 3"
        tokens = list(generate_tokens(text))
        print(tokens)
  2. 保存 texttokenizer.py 文件。

  3. /home/labex/project 目录运行 texttokenizer.py 脚本:

    python texttokenizer.py
  4. 输出应该是一个表示输入文本中词元的 Token 对象列表:

    [Token(type='NAME', value='total'), Token(type='WS', value=' '), Token(type='EQ', value='='), Token(type='WS', value=' '), Token(type='NUM', value='1'), Token(type='WS', value=' '), Token(type='ADD', value='+'), Token(type='WS', value=' '), Token(type='NUM', value='2'), Token(type='WS', value=' '), Token(type='MUL', value='*'), Token(type='WS', value=' '), Token(type='NUM', value='3')]

恭喜!你已成功实现 generate_tokens 函数并用示例文本对其进行了测试。在下一步中,你将学习如何使用 generate_tokens 函数对更长的文本进行分词。

✨ 查看解决方案并练习

总结

恭喜!你已完成这个项目。你可以在 LabEx 中练习更多实验来提升你的技能。