機械学習用のテキストデータを簡単に抽出する方法 (2021/09/01)
機械学習用のテキストデータを簡単に抽出する方法 (2021/09/01)
投稿者: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の詳細については、以下をご覧ください。
コメント
コメントを投稿