Python を使ったテキストトークン化

PythonBeginner
オンラインで実践に進む

はじめに

このプロジェクトでは、Python を使ってテキストトークナイゼーションシステムを実装する方法を学びます。テキストトークナイゼーションは自然言語処理における基本的なタスクであり、与えられたテキストをトークンと呼ばれる小さな単位に分解します。これらのトークンは、テキスト内の単語、数字、句読点、またはその他の意味のある要素を表すことができます。テキストをトークン化する能力は、コンパイラの字句解析、感情分析、テキスト分類など、多くのアプリケーションにとって不可欠です。

👀 プレビュー

## 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 の 2 つの属性を持つ名前付きタプルとして定義します。

    Token = namedtuple("Token", ["type", "value"])
✨ 解答を確認して練習

generate_tokens 関数の実装

このステップでは、入力テキストを受け取り、トークンのストリームを生成する generate_tokens 関数を実装します。

  1. texttokenizer.py ファイルにて、generate_tokens 関数を定義します。

    def generate_tokens(text):
        ## Define token types and corresponding regular expressions
        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+",
        }
    
        ## Combine regular expressions into one large regular expression
        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. 次に、| 演算子を使ってすべての正規表現を 1 つの大きな正規表現に結合します。

  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 でさらに多くの実験を行って練習してください。