機械学習用のテキストデータを簡単に抽出する方法 (2021/09/01)

機械学習用のテキストデータを簡単に抽出する方法 (2021/09/01)

https://blogs.oracle.com/ai-and-datascience/post/how-to-easily-extract-text-data-for-machine-learning

投稿者:Jize Zhang



テキストマイニングや自然言語処理(NLP)モデルの構築では、テキストデータを扱うことになります。しかし、多くの企業のユースケースでは、生のテキストデータはPDFやMicrosoft Wordのファイルになっており、機械学習モデルでは使用できません。 どうすればいいのでしょうか?


OCI Data Scienceで提供されているAccelerated Data Science SDK (ADS)には、生のテキストデータをMLに適した形式に変換するテキストデータセットモジュールが付属しています。インポートとエクスポートは、ソースとデスティネーションの両方で、ローカルとリモートのストレージをサポートしているので、効率的です。ここでは、ADSのテキストデータセットモジュールについて、その使い方をご紹介します。



PDF, DOC, または TXT


ADSテキストデータセットモジュールでは,.pdf,.docx,.doc,またはプレーンテキスト形式のデータを読み込むことができます.非テキストファイルは、読み込み時にテキストファイルに変換されます。ソースファイルは、ローカルまたはリモートのOCI Object Storageに保存できます。 舞台裏では、ADSはApache Tika(デフォルト)またはpdfplumber(pdfのみ)を使用してファイルを変換します。読み込まれたデータは、データジェネレータ、pandas/cuDFデータフレームとして返されるか、プレーンテキストとしてローカルまたはリモートの任意の保存先に保存することができます。


では、このモジュールはどのように使えるのでしょうか?


  •     OCI Object StorageからNotebookセッションへのデータの読み込み
  •     ファイルのフォルダを読み込んで、ファイルパスから情報(トピックなど)を抽出し、機械学習のタスクに利用
  •     pdfやdocxファイルをプレーンテキストに変換して、OCIオブジェクトストレージに直接永続化


それでは、ADSテキストデータセットモジュールのコア機能を検証し、これらの一般的なシナリオでの使用方法を学びましょう。


テキストデータセットAPI


ADSテキストデータセットには、テキストデータを処理するための4つの関数が用意されています。


  •     read_line: 行ごとにファイルを読みます。各行はコレクションのレコードに対応します。
  •     read_text: 各ファイルがコレクションのレコードに対応するファイルを読みます。
  •     convert_to_text:ファイルをプレーンテキストに変換して保存します。ファイルをプレーンテキストファイルに変換して保存します。
  •     metadata_allおよびmetadata_schema:各ファイルからメタデータを抽出します。各ファイルからメタデータを抽出します(詳細はドキュメントをご覧ください)。


ここで、"コレクション "とは、データ・ジェネレーターまたはデータ・フレームのことで、"レコード "とは、ジェネレーターのアイテムまたはデータ・フレームの行のことです。


4つの関数は、DataLoaderオブジェクトを介して呼び出されます。DataLoaderオブジェクトは、ソースファイルのフォーマットを最小限に指定するだけで作成できます。例えば、以下のようになります。


from ads.text_dataset.dataset import TextDatasetFactory as textfactory


dl = textfactory.format('pdf')


 

pdfファイルを解析できるデータローダオブジェクトを作成します。



OCI Object StorageからNotebookセッションにデータフレームとしてデータをロード


データをデータフレームに読み込むために、まず、以下のようにDataLoaderを作成します。


dl = textfactory.format('pdf').engine('pandas')


 


ここで、"engine "オプションは、読み込まれたデータの実体化にどのエンジンを使用するかを指定します。現在は、"pandas "と "cudf "がサポートされています。engineを "pandas "に設定すると、データローダは読み込んだデータをpandasのデータフレームとして返すようになります。指定しない場合は、ロードされたデータはデータ・ジェネレータとして返され、いつ、どのように具現化するかはユーザーの判断に委ねられます。


dataLoaderができたので、あとはソースファイルのuriを関数 "read_text "に渡すだけです。


df = dl.read_text(

    f'oci://{bucket}@{namespace}/pdf_samples/*.pdf',

    storage_options={"config": oci.config.from_file()},

)


ここでは,グロブパターンを用いてソースデータのパスを指定し,パターンにマッチする各ファイルが,返されるデータフレームの1行に対応します。ソースファイルの位置は、パスのリストでもよいことに注意してください。


異なるフォーマットのデータをロードするには、dataloaderオブジェクトの初期化時に「format」オプションを変更するだけです。また、ファイル内の各行をデータフレーム内の行に対応させたい場合は、「read_text」の代わりに「read_line」を呼び出すことができます。


ソースデータのパスがクラウドストレージを指している場合、通常は「storage_options」を指定する必要があります。OCI Object Storageでは、コード例のように、"config "が必要です。"config "には認証情報が格納されます。Notebookセッションでリソースプリンシパルを使用している場合は、単純に「storage_options = {"config": {}}」. そうでない場合は、"oci.config.from_file() "を使って設定ファイルから設定を読み込む必要があります。この関数に渡せる引数やパラメータの詳細については、こちらのドキュメントをご覧ください。


ファイルのフォルダを読み、パスから情報を抽出


データはトピックごとにフォルダにまとめられていることがあります。例えば、履歴書は採用職種ごとに、レビューは感想ごとに、ニュースは分野ごとにグループ化されていたりします。例えば、ニュースグループ20のフォルダ構造は次のようになっています。

20news/

    alt.atheism/

    comp.graphics/

    ...

    talk.politics.misc/

    talk.religion.misc/


ここでのフォルダ名は、分類タスクのラベルとして使用できます。ラベル付きのデータフレームを作るには、次のようにします。

dl = textfactory.format('txt').backend('tika').engine('pandas').option(Options.FILE_NAME)

df_clf = dl.read_text(

    f'oci://{bucket}@{namespace}/20news-small/**/[1-9]*',

    storage_options={"config": {}},

    df_args={'columns': ['path', 'text']},

)

df_clf['label'] = df_clf['path'].apply(lambda x: x.split('/')[-2])


このコードスニペットでは、"backend "を "tika "に指定していることに注目してください。デフォルトではプレーンテキストファイルは変換の必要がありませんが、今回はデータがutf-8エンコードされていないので、tikaを使って変換しています。


さらに、dataloaderオブジェクトに「Option.FILE_NAME」というオプションを設定しています。これは、データローダがファイルを読み込む際に、ファイルの内容に加えて、ファイルのパスを取得するように指示するものです。


pdfやdocxをプレーンテキストに変換してOCI Object Storageに永続化


変換したデータをNotebookセッションで一度だけ使用するのではなく、永続化したい場合があります。例えば、同じデータセットを複数のタスクやチームの複数の人が使用することがあります。このプロセスを効率化するために、Dataloaderクラスには「convert_to_text」関数が用意されています。この関数は、ソースとデスティネーションの場所を受け取り、ソースファイルをプレーンテキストに変換して、デスティネーションの場所に直接書き込みます。例を挙げると

dl = textfactory.format('pdf')

dl.convert_to_text(

    f'oci://{bucket}@{namespace}/pdf_samples/*.pdf',

    f'oci://{dst_bucket}@{dst_namespace}/extracted/pdfs',

    storage_options={"config": oci.config.from_file()},

)


または、docx/docファイルの場合

dl = textfactory.format('docx')

dl.convert_to_text(

    [f'oci://{bucket}@{namespace}/docx_samples/*.docx', f'oci://{bucket}@{namespace}/doc_samples/*.doc'],

    f'oci://{dst_bucket}@{dst_namespace}/extracted/docs',

    storage_options={"config": oci.config.from_file()},

)



形式にこだわらない


要約すると、ADSテキストデータセットモジュールは、PDFやMicrosoft Wordsとして一般的に提供されている企業データから、データサイエンティストが操作しやすいプレーンテキストへの移行を促進することを目的としています。APIの詳細やサンプルについては、ドキュメントをご参照ください。


OCI Data ScienceでAccelerated Data Science SDKを試すには、Oracle Cloud Free Tierにサインアップし、以下の簡単な手順でOCIアカウントをData Scienceを使用するように設定します。 OCI Data Scienceの詳細については、以下をご覧ください。 

コメント

このブログの人気の投稿

Oracle Database 19cサポート・タイムラインの重要な更新 (2024/11/20)

Oracle APEXのInteractive Gridで、Oracle Formsと比較して、重複行の検証を制御/通過させる方法 (2022/07/21)

Oracle APEX 24.1の一般提供の発表 (2024/06/17)