Markdown化の性能に関して、MarkItDownとDocument Intelligenceを比較してみた

# はじめに
microsoftがMarkItDownというツールを公開しました。
https://github.com/microsoft/markitdown

MarkItDownは、pptxやxlsxなどをmakrdownに変換することができ、RAGなどに活用できそうです。

ところで、同じくmicrosoftが提供するAzureのDocument Intelligenceにも、同じようにmarkdown形式にする機能があることはご存知でしょうか？

そこで、今回はMarkItDownとDocument Intelligenceの性能を比較してみたいと思います。
なお、それぞれの環境構築や実行方法はここでは取り扱いません。知りたい方は以下の記事をご覧ください。

### MarkItDown
[多様な形式のファイルを Markdown に変換できるMicrosoft 提供の MarkItDown を試してみた #Python - Qiita](https://qiita.com/manabian/items/9713f6e226cd83d06ac4)

[Microsoft の「MarkItDown」で Officeファイルを Markdownファイルに変換【Python】 #office - Qiita](https://qiita.com/youtoy/items/e0495701f03c1875e032)

### Document Intelligence
[【最新】Azure AI Document Intelligence による文書構造の解析（Markdown、図、セクション） #AzureAISearch - Qiita](https://qiita.com/nohanaga/items/1263f4a6bc909b6524c8)

[Azure Document Intelligenceのレイアウトモデルを使ってPDFをMarkdownに変換しRAG用にセマンティックチャンキングを試す #langchain - Qiita](https://qiita.com/h_id32/items/1821bc62f8bb445b6b6d)
# 目次
* [検証](#検証)
    * [pdf](#pdf)
    * [docx](#docx)
    * [xlsx](#xlsx)
    * [pptx](#pptx)
* [まとめ](#まとめ)
* [考察](#考察)
* [今後の展望](#今後の展望)

# 検証
## 検証概要

* 取り扱う拡張子は、`pdf` `docx` `xlsx` `pptx` 
* 画像は、言語モデルを指定すればできるらしいが、今回は未検証
* 各拡張子ごとに、MarkItDownとDocument IntelligenceのOCR結果を比較して検証

## pdf
### 扱うデータ
[Webサイト等の整備及び廃止に係るドメイン管理ガイドライン](https://cio.go.jp/guides/#huzoku)
同じ内容でもpdfとdocxで差が出るかも見たいので、pdfとdocxで同じ内容のものを扱います。

### MarkItDown
微妙ですね。文字起こしはできていますが、目次が崩れていたり見出しがつけられていなかったりで、うまく構造化できていません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940611/f4afb540-f81e-87b2-c500-6f65b3cc99c1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940611/cc2a565a-cd4a-dcb5-ff1f-c7d0c5d0c116.png)

### DocumentIntelligence
表部分含めてある程度はうまく構造化できていそうですが、一部表形式でミスがあります。（本来表1-1は1つなのに、2つに分裂している。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940611/e92819d7-96e6-f087-883a-45a451a5d7df.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940611/398cebad-acfc-2be6-5834-833bca0eb41b.png)

### 総評
* MarkItDownは複雑なpdfにはあまり強くなさそう
    * 簡単な構造ならMarkItDownで十分だと思われる
* DocumentIntelligenceはpdfに強そう

## docx
### 扱うデータ
pdfと同じです。
[Webサイト等の整備及び廃止に係るドメイン管理ガイドライン](https://cio.go.jp/guides/#huzoku)

### MarkItDown
pdfの時とは違い、表形式含めかなり綺麗に構造化できています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940611/10aaa563-3be3-e1ba-34aa-1176095c4dd3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940611/140e62da-97c4-4b5b-940a-40ae7b53db4a.png)

ここで気づいたのですが、MarkItDownはリンクも紐づけできるみたいです。
このdocxは以下のように謎のリンクが発行されていてジャンプできませんでしたが...
```
目次

[１ はじめに 2](#_Toc509578839)

[１.１ 背景と目的 2](#_Toc509578840)

[１.２ 適用対象 2](#_Toc509578841)

[１.３ 位置づけ 3](#_Toc509578842)

[１.４ 用語 3](#_Toc509578843)

[２ 具体的なドメイン管理方法 4](#_Toc509578844)

[２.１ 基本原則 4](#_Toc509578845)

```

### Document Intelligence
こちらも、pdfの時よりも高精度になっているように見えます。表もpdfの時のミスがなくなっていますね。
構造化の精度はMarkItDownとあまり変わらないように見えます。
ただ、MarkItDownと違ってハイパーリンクは発行されません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940611/ce7c3bd0-7946-babf-305b-8b2fb0c10da5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940611/d81dfc93-b005-73e3-8af5-8996c5d25dbc.png)

### 総評
* どちらともdocx形式の方がpdf形式より精度がいい
* docxに関しては、どちらも同じくらい精度がいい

## xlsx
[（ODA） 2022年版開発協力白書図表（Excel版）](https://www.mofa.go.jp/mofaj/gaiko/oda/press/shiryo/page24_000206.html)
こういう機械可読ではないxlsxはどうなるか
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940611/9c1235f6-dd38-e565-a3f2-5236e0ca003a.png)

### MarkItDown
シートごとに見出しがついています。カラム名は崩れていますが、表形式の体裁は保てていますね。
実は[MarkItDownのソースコード](https://github.com/microsoft/markitdown/blob/main/src/markitdown/_markitdown.py#L507)を読んだ段階でこんな感じになることは予想していました。
`pd.read_excel`で読み込んだものをhtml形式にしているだけなので、カラムなどをよしなにしてくれるわけではないです。(2024/12/24現在)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940611/9498b0f0-93f9-4566-baa5-98514d6a15a8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940611/d924d0f9-4e42-d8c1-3a5d-5201b5c22c04.png)

### Document Intelligence
表形式になりません。そもそもDocument Intelligenceはxlsxを表形式にできないのでこうなります。どうしても読ませたい場合は、xlsxをpdfに変換してそれをmarkdownにするのが一番いいと思います。
（microsoftのサービスなのになぜ...）
参考: [Document Intelligence ファイル形式別 解析性能徹底検証！](https://intersect.inc/scW0fnId/wpT9aq0h#index_WsQ2dAyf)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940611/817c3b08-6412-2407-7546-a9bd3ebcc420.png)

### 総評
* MarkItDownはxlsxを表形式に読み取れるが、カラムなどはうまく読み取れない
* Document Intelligenceはそもそもxlsxを表形式に読み取れない



## pptx
[オープンデータ基本指針の概要](https://cio.go.jp/policy-opendata#ketteibunsyo)
こんな感じの典型的な官公庁スライドをどこまで構造化できるか

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940611/0b4852d0-8360-d36d-02fe-b882ddd0f01a.png)

### MarkItDown
ただ内容を列挙しているだけのように見えますね。特に構造化はしていなさそうです。
順番も、例えば「オープンデータの意義」や「オープンデータの定義」などの見出しが下に来ちゃっています。
(markdown形式だと逆に見づらかったので、生のデータを画像化してます。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940611/1e96ab14-ef3a-0158-2af4-e14cd62bf4ce.png)

### Document Intelligence
こちらも、MarkItDownと同様、内容を列挙してるだけで、構造化はできていません。
順番も、MarkItDownと同様に見出しが後ろに来てます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940611/33ee48de-8226-c99f-f717-3c68b2c9e9a7.png)

**おまけ**
ちなみに、このpptxを画像化してからDocument Intelligenceに流すといい感じに構造化してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940611/06359e08-d669-8960-5486-b1083e5b29e4.png)

### 総評
* どちらも精度としては微妙
* 画像にしてDocument Intelligenceに読み取らせる方が精度がいい

# まとめ
* Document Intelligenceはpdfが強い
* MarkItDownはxlsxがそこそこ
    * ただし機械可読な場合限定で、excel文書みたいなのは無理そう
* pptxはどちらも微妙
* docxはどちらも良さそう

表形式にまとめるとこんな感じになります。

|      | MarkItDown | Document Intelligence | 
| ---- | :--------: | :-------------------: | 
| pdf  | △         | ◯                    | 
| docx | ◎         | ◎                    | 
| xlsx |  △~◯         | ✕                    | 
| pptx | △         | △                    | 

# 考察
現時点では、MarkItDownはこれ一本でなんでもできるっていうレベルには達してない用に思えます。
もしRAGなどで運用する場合、拡張子別に考えると以下のようにするのが良さそうです。

* `xlsx`: pdfに変換してからDocument Intelligenceで読む
* `pdf`: Document Intelligenceで読む
* `pptx`: 画像にしてDocumente Intelligenceで読む
* `docx`: どちらでも可

xlsxはDocument Intelligenceよりは性能良さそうですが、そもそも内部ではpandasで読んでるだけなので、普通に直接pandasを使うか、もっと自由度の高いopenpyxlなどを使う方がベターだと思います。

# 今後の展望
MarkItDownはまだ出たばかりなので、今後のアップデートに期待ですね。
Document Intelligenceは早くxlsxを読み取れるようにしてほしい...