「ヌガーで科学文書処理を高める」

「ヌガーによる科学文書処理の効果を引き上げる方法」

イントロダクション

自然言語処理および人工知能の分野では、科学的なPDFなどの非構造化データソースから価値ある情報を抽出する能力がますます重要になっています。この課題に対処するため、Meta AIは「Nougat」または「Neural Optical Understanding for Academic Documents」と呼ばれる最先端のトランスフォーマーベースのモデルを導入しました。Nougatは、科学的なPDFを一般的なMarkdown形式に転写するために設計されたモデルであり、Lukas Blecher、Guillem Cucurull、Thomas Scialom、Robert Stojnicによって「Nougat: Neural Optical Understanding for Academic Documents」というタイトルの論文で紹介されました。

これにより、オプティカル文字認識(OCR)技術の画期的な変革が実現され、NougatはMeta AIの印象的なAIモデルの最新バージョンとなります。この記事では、Nougatの機能を探求し、そのアーキテクチャを理解し、このモデルを使用して科学的なドキュメントを転写する実践的な例を見ていきます。

学習目標

  • Meta AIの最新トランスフォーマーモデルであるNougatを理解する。
  • Nougatが前任であるDonutを基に開発され、ドキュメントAIに対する最先端アプローチが導入されていることを学ぶ。
  • ビジョンエンコーダ、テキストデコーダ、エンドツーエンドのトレーニングプロセスを含むNougatを学ぶ。
  • ConvNetsの初期からSwinアーキテクチャと自己回帰デコーダの変革的な力まで、OCR技術の進化に関する洞察を得る。

この記事はデータサイエンスブログマラソンの一環として公開されました。

Nougatの誕生

NougatはMeta AIファミリーの最初のトランスフォーマーモデルではありません。前任である「Donut」は、ビジョンエンコーダとテキストデコーダの能力を示すトランスフォーマーベースのモデルでした。コンセプトはシンプルで、モデルにピクセルを供給し、テキストの出力を受け取ります。このエンドツーエンドアプローチにより、複雑なパイプラインは不要で、注意力が必要なだけであることが証明されました。

Nougatのようなモデルの機能を支える「ビジョンエンコーダ・テキストデコーダ」パラダイムの基本的な概念について簡単に説明しましょう。前任であるDonutは、ビジョンとテキスト処理を単一のモデルで組み合わせる能力を導入しました。これらのモデルは伝統的なドキュメント処理パイプラインとは異なり、生のピクセルデータを受け取り、テキストコンテンツを生成します。このアプローチは、Transformerアーキテクチャの注意機能を利用して結果をもたらします。

Nougatが次のステップへ

Donutの成功を基に、Meta AIはNougatを投入し、OCRを新たなレベルに引き上げました。前任と同様、NougatはSwin Transformerをビジョンエンコーダとし、mBARTに基づいたテキストデコーダを採用しています。Nougatは、科学的なPDFの生のピクセルからテキストのマークダウンを予測します。これは、科学的な知識をなじみ深いMarkdown形式に簡単に転写するための画期的なシフトです。

Meta AIは、ビジョン・テキストパラダイムを科学的なドキュメントの課題に適用しました。PDFは広く採用されていますが、科学的な知識を正確に理解し、有意義な情報を抽出する際には課題があります。

PDFはセマンティックな情報の欠落により、特に数学的な構造に関わる場合に効果的な知識検索の障壁となります。このギャップを埋めるために、Meta AIはNougatを導入しました。

なぜNougatなのか?

人々は従来、科学的な知識を書籍やジャーナルにPDF形式で保存してきました。しかし、PDF形式はしばしば数学的な構造などの重要なセマンティック情報の欠落を招くことがあります。Nougatは、科学的なドキュメント上でOCRを実行し、それらをマークアップ言語に変換することで、このギャップを埋めます。このブレークスルーにより、科学的な知識を収集し、人間が読めるドキュメントと機械が読み取れるテキストのギャップを解消します。

NougatはOCRエンジンを逆解析してトランスフォーマーアーキテクチャに依存して複雑な科学文書を正確に転写することに成功しました。これにより、ドキュメントAIの扉が開かれました。PDFに閉じ込められていた科学の知識がNougatと共に解放され、処理されるようになりました。

OCRの旅

Nougatの旅はOCR技術への証です。1980年代後半、畳み込みニューラルネットワーク(ConvNets)をOCRに適用することは画期的です。しかし、その当時の制限により、ページ全体を読み取ることができるエンドツーエンドのシステムを訓練するという考えは夢に過ぎませんでした。

今日に至るまで、ConvNetsとトランスフォーマー、自己回帰デコーダを組み合わせたSwinアーキテクチャによって、ページ全体を転写することが可能になりました。Donutと同様に、Nougatもビジョンテキストパラダイム、トランスフォーマーベースの画像エンコーダ、自己回帰テキストデコーダに従います。

Nougatの使用:実践的な例

Nougatを探ってきたので、科学的なPDFを標準のMarkdown形式に転写するためにこのパワフルなモデルをどのように使用するかについて実践的な例について探ってみましょう。この記事の完全なコードはここで見つけることができます

環境の設定

必要なライブラリをインストールします。これには、PDFを画像として読み取るためのpymupdf、その他のライブラリであるpython-Levenshtein、およびNLTKが含まれます。

!pip install -q pymupdf python-Levenshtein nltk!pip install -q git+https://github.com/huggingface/transformers.git

モデルとプロセッサの読み込み

このステップでは、Nougatモデルと関連するプロセッサを読み込んで、PDF転写の準備をします。

from transformers import AutoProcessor, VisionEncoderDecoderModelimport torch# ハブからNougatモデルとプロセッサを読み込むprocessor = AutoProcessor.from_pretrained("facebook/nougat-small")model = VisionEncoderDecoderModel.from_pretrained("facebook/nougat-small")

メモリリソースを管理しましょう。

%%capturedevice = "cuda" if torch.cuda.is_available() else "cpu"model.to(device)

次のステップでは、PDFペーパーをラスタライズするための関数を記述します。

from typing import Optional, Listimport ioimport fitzfrom pathlib import Pathdef rasterize_paper(    pdf: Path,    outpath: Optional[Path] = None,    dpi: int = 96,    return_pil=False,    pages=None,) -> Optional[List[io.BytesIO]]:    """    PDFファイルをPNGイメージにラスタライズします。    Args:        pdf (Path): PDFファイルのパス。        outpath (Optional[Path], optional): 出力ディレクトリ。Noneの場合、PILイメージが返されます。デフォルトはNoneです。        dpi (int, optional): 出力DPI。デフォルトは96です。        return_pil (bool, optional): ディスクに書き込む代わりにPILイメージを返すかどうか。デフォルトはFalseです。        pages (Optional[List[int]], optional): ラスタライズするページ。Noneの場合、すべてのページがラスタライズされます。デフォルトはNoneです。    Returns:        Optional[List[io.BytesIO]]: `return_pil`がTrueの場合、PILイメージ。それ以外の場合はNone。    """    pillow_images = []    if outpath is None:        return_pil = True    try:        if isinstance(pdf, (str, Path)):            pdf = fitz.open(pdf)        if pages is None:            pages = range(len(pdf))        for i in pages:            page_bytes: bytes = pdf[i].get_pixmap(dpi=dpi).pil_tobytes(format="PNG")            if return_pil:                pillow_images.append(io.BytesIO(page_bytes))            else:                with (outpath / ("%02d.png" % (i + 1))).open("wb") as f:                    f.write(page_bytes)    except Exception:        pass    if return_pil:        return pillow_images

PDFの読み込み

このステップでは、サンプルのPDFを読み込み、fitzモジュールを使用してPDFから各ページを表すPillowイメージのリストに変換します。Crouse et al. 2023を使用します。

from huggingface_hub import hf_hub_download
from typing import Optional, List
import io
import fitz
from pathlib import Path
from PIL import Image

filepath = hf_hub_download(repo_id="inuwamobarak/random-files", filename="2310.08535.pdf", repo_type="dataset")
images = rasterize_paper(pdf=filepath, return_pil=True)
image = Image.open(images[0])
image

転写を生成する

このステップでは、画像をNougatモデルに入力するために準備します。自動回帰生成プロセスを制御するためのカスタムの停止基準も設定します。これらの基準は、モデルがテキストの生成を終了するタイミングを決定します。

pixel_values = processor(images=image, return_tensors="pt").pixel_values

from transformers import StoppingCriteria, StoppingCriteriaList
from collections import defaultdict

class RunningVarTorch:
    def __init__(self, L=15, norm=False):
        self.values = None
        self.L = L
        self.norm = norm
    
    def push(self, x: torch.Tensor):
        assert x.dim() == 1
        if self.values is None:
            self.values = x[:, None]
        elif self.values.shape[1] < self.L:
            self.values = torch.cat((self.values, x[:, None]), 1)
        else:
            self.values = torch.cat((self.values[:, 1:], x[:, None]), 1)
    
    def variance(self):
        if self.values is None:
            return
        if self.norm:
            return torch.var(self.values, 1) / self.values.shape[1]
        else:
            return torch.var(self.values, 1)

class StoppingCriteriaScores(StoppingCriteria):
    def __init__(self, threshold: float = 0.015, window_size: int = 200):
        super().__init__()
        self.threshold = threshold
        self.vars = RunningVarTorch(norm=True)
        self.varvars = RunningVarTorch(L=window_size)
        self.stop_inds = defaultdict(int)
        self.stopped = defaultdict(bool)
        self.size = 0
        self.window_size = window_size
    
    @torch.no_grad()
    def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor):
        last_scores = scores[-1]
        self.vars.push(last_scores.max(1)[0].float().cpu())
        self.varvars.push(self.vars.variance())
        self.size += 1
        
        if self.size < self.window_size:
            return False
        
        varvar = self.varvars.variance()
        
        for b in range(len(last_scores)):
            if varvar[b] < self.threshold:
                if self.stop_inds[b] > 0 and not self.stopped[b]:
                    self.stopped[b] = self.stop_inds[b] >= self.size
                else:
                    self.stop_inds[b] = int(min(max(self.size, 1) * 1.15 + 150 + self.window_size, 4095))
            else:
                self.stop_inds[b] = 0
                self.stopped[b] = False
        
        return all(self.stopped.values()) and len(self.stopped) > 0

outputs = model.generate(
    pixel_values.to(device),
    min_length=1,
    max_length=3584,
    bad_words_ids=[[processor.tokenizer.unk_token_id]],
    return_dict_in_generate=True,
    output_scores=True,
    stopping_criteria=StoppingCriteriaList([StoppingCriteriaScores()])
)

ポストプロセッシング

最後に、生成されたトークンIDを読み取れるテキストにデコードし、生成されたMarkdownコンテンツの精度を高めるためのポストプロセッシングステップを適用します。結果の出力は、科学的なPDFからの転記コンテンツを表しています。

generated = processor.batch_decode(outputs[0], skip_special_tokens=True)[0]
generated = processor.post_process_generation(generated, fix_markdown=False)
print(generated)

生成した出力はMarkdown形式で提供されます:

Nougatでの推論の実行方法は以上です。このテキストの一握りを抽出することは簡単です。この記事の完全なコードはこちら https://github.com/inuwamobarak/nougat で確認できます。記事の最後には他のリンクもありますので、是非ご覧ください。

パフォーマンスメトリック

テストセット上でヌガーのパフォーマンスを評価するために、様々なメトリックが使用されました。これらのメトリックは、科学的なPDFをMarkdown形式に変換するヌガーの能力を包括的に評価します。

編集距離

編集距離(レーベンシュタイン距離)は、一つの文字列を別の文字列に変換するために変更する必要のある文字の数を定量化します。挿入、削除、置換を含んでいます。正規化された編集距離は、計算された距離を文字数で割ることでヌガーの評価に使用されました。このメトリックは、科学的文書の複雑さを考慮しながら、ヌガーが正確に内容を転写する能力を示します。

BLEUスコア

BLEU(バイリンガル評価補助)スコアは、もともと機械翻訳の品質評価に使用されるメトリックで、ヌガーによって生成された候補テキストと参照テキストとの間の一致するn-gramの数に基づいてスコアを計算します。これにより、ヌガーが元の内容とn-gramの類似性をどのように捉えているかが分かります。

METEORスコア

METEORは、再現率を重視した特筆すべき機械翻訳メトリックであり、OCRの評価には一般的な選択ではありませんが、ヌガーがコアなコンテンツと元の情報源をどのように保持しているかをユニークな視点で提供します。BLEUと同様に、METEORは転写テキストの品質を評価するのに役立ちます。

F-スコア

F1スコアは、ヌガーの転写の適合率と再現率を組み合わせたものです。これはモデルのパフォーマンスに対するバランスの取れた視点であり、内容の捉え方と意味のある情報の正確な保持能力を考慮しています。

学術文書を超えるヌガーの可能な応用分野

ヌガーは主に学術文書の転写に使用されることが目的ですが、その応用範囲は遥かに広がっています。以下に、ヌガーが大きな影響を与える可能性のあるいくつかの分野を紹介します。

医療文書

ヌガーは医療記録や臨床ノートの転写に使われることができます。これにより、医療情報のデジタル化と医療専門家の情報検索が支援されます。

法的文書や契約書、裁判文書は一般的にPDF形式で存在します。ヌガーはこれらの文書を機械可読なテキストに変換することで、法的プロセスや研究の効率化を図ることができます。

特殊分野

ヌガーの適応性により、工学、ファイナンスなどの専門分野で使用することができます。技術報告書、財務諸表などの専門分野固有の文書を変換することができます。

ヌガーは、科学的なPDFを機械可読なMarkdown形式に変換するための実用的で効率的な解決策として、文書AIの一石を投じました。文書AIへの貢献は、情報検索がより効率的に行われる未来の一端を示しています。

科学的テキスト認識の未来

ヌガーは常にVisionEncoderDecoderで使用され、ドーナツのアーキテクチャを模倣しています。画像がモデルに送られ、ヌガーのVisionEncoderDecoderがテキストを自己回帰的に生成します。NougatImageProcessorクラスは画像の前処理を担当し、NougatTokenizerFastは生成されたターゲットトークンをターゲット文字列にデコードします。NougatProcessorは、これらのクラスを組み合わせて特徴抽出とトークンデコードを行います。

この機能は最先端であり、近々さらに適応されるでしょう。ヌガーは文書AIを象徴し、科学的なPDFを機械可読なMarkdown形式に変換するための解決策です。このモデルが広まりを見せるにつれて、研究者や学者が科学文献との対話をより効率的に行い、知識をデジタル時代でより利用しやすくする可能性があります。

結論

ヌガーは、メタAIファミリーにおける単なる甘い追加ではなく、科学的文書のOCRにおける革新的なステップです。複雑なPDFをMarkdownテキストに変換する能力は、科学的な知識の獲得においてゲームチェンジャーとなります。技術が進化し続ける中で、ヌガーの影響はAIや文書処理などの領域に響いていくでしょう。

知識へのアクセスが重要な世界において、ヌガーは科学的なPDFに格納された情報の莫大さを引き出す強力なツールであり、人間が読み取れる文書と機械可読なテキストとの間のギャップを埋めるものです。文書AIへの貢献は、情報検索がこれまで以上に効率的な未来の一端を示しています。

重要なポイント

  • Nougat(ヌガー)は、Meta AIの最新のOCRモデルであり、科学的なPDFを使いやすいMarkdown形式に変換することができます。
  • このモデルは、Swin TransformerビジョンエンコーダーとmBARTベースのテキストデコーダーを組み合わせており、エンドツーエンドで動作します。
  • トランスフォーマーアーキテクチャを使用することで、科学的なドキュメントの転写などの複雑なタスクを簡素化できます。
  • 初期のConvNetsから現代のSwinアーキテクチャや自己回帰デコーダまで、OCR技術の進化がNougatの可能性を広げました。

よくある質問

  • https://huggingface.co/facebook/nougat-base
  • https://github.com/NielsRogge/Transformers-Tutorials/
  • https://github.com/inuwamobarak/nougat
  • https://arxiv.org/abs/2310.08535
  • https://arxiv.org/abs/2308.13418
  • https://huggingface.co/datasets/inuwamobarak/random-files
  • https://huggingface.co/spaces/ysharma/nougat

本記事に掲載されているメディアはAnalytics Vidhyaの所有ではありません。著者の裁量で使用されています。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

AIテクノロジー

「GPTの進化を探る ChatGPT-4の新機能と、コンバーショナルAIの再定義」

以前のバージョンをベースに、多様性と倫理的考慮を特徴とするConversational AIのChatGPT-4の進化を探求し、新たな可能性を...

AIテクノロジー

「リモートワーク技術の探究:トレンドとイノベーション」

「バーチャルオフィスやコラボレーションツールからワークスペースの未来、サイバーセキュリティ、AI自動化、働き方と生活の...

AIテクノロジー

『PDFを扱うための4つのAIツール - ボーナスツールもあり』

「情報を探し求めるためにPDFドキュメントの山をひたすら漁っていることはありませんか?私たちは、これがあなたが認めたくな...

データサイエンス

「AIベースの駐車管理システムが効率を向上させる方法」

仕事場に車を駐車する時や、店舗へ訪れる際に駐車場に入るとき、駐車場が整備されていて、駐車場を見つけることができ、車が...

AIテクノロジー

デジタル変革によって打撃を受ける可能性が低い6つの産業

「急速な技術の進歩やデジタル変革が進む時代において、多くの産業がその業務の風景に根本的な変化を経験していますしかし、...

AIテクノロジー

Python Webスクレイピングの始め方(LLMs向け)

ウェブスクレイピングの世界に足を踏み入れることは、かなりの冒険となるかもしれません初心者としては、それが一体何なのか...