Python を使用して事故報告書から死亡者数を抽出する#
今日は Python で、土木業界の事故報告書から死亡者数を抽出するための関数を作成します。私の設計アイデアは以下の通りです:
- 観察の結果、事故報告書の 80%には「XX 人死亡」というパターンがあります。XX は漢数字またはアラビア数字のいずれかです。
- そこで、
pattern_death = r'([\d\w]+)(人死亡|名工人死亡)'
という正規表現を作成し、このパターンを抽出します。 - 安徽省のいくつかの調査報告書のテストで、このパターンは「XX 人死亡」の前のテキストも抽出してしまうことがわかりました。例えば、「この工事で 5 人死亡しました」という文に対して、
([\d\w]+)
は任意の漢字または数字を抽出する意味を持っているためです。 - そこで、
pattern_death_num = r'(\d+|[零一二两三四五六七八九十百千万]+)(人死亡|名工人死亡)'
という 2 つ目の正規表現を作成し、前のパターンで抽出された文の中の数字(漢数字またはアラビア数字)を抽出します。 - その後、cn2an というサードパーティのライブラリをダウンロードして、漢数字を数値に変換します。
- 抽出された数字を辞書に保存し、数字が抽出されなかった場合でもテキストに「死亡」という印を付けます。
私がここで説明しているように、簡単に見えるかもしれませんが、最初のステップからこの目標に到達するまでにかかった時間や、条件の抽出、エラーの回避、抽出されたデータの保存などのために関数を設計するためにかかった時間は想像できないほどです。
多くのエラーを報告し、何度も反復した後、このプログラムはほぼ動作するようになりました。このアイデアにより、393 件の事故報告書から 393-56 件の死亡者数を抽出できるようになりました。
おそらく、グラフに表示されている 57 件の「待確認」ファイルがあるため、抽出されたデータの数は 383-57 ではないかと思われるかもしれません。
その通りです。欠けている 1 つのファイルが今日話題になっているものです。
一字の違いがもたらす作業量#
このデータは常にエラーが発生しており、問題のあるファイルを 1 つずつテストして特定する必要がありました。
エラーの原因は次のとおりです:プログラムは確かに「X 人死亡」を認識し、その「X」を抽出しますが、エラーが発生しているファイルでは「二人死亡」ではなく「两人死亡」が使用されています。cn2an という、漢数字をアラビア数字に変換する専用のライブラリは、「二」しか認識できず、「两」を認識できません。
そこで、もし「两」が認識された場合は「二」に変更し、その後にcn2an
を使用してアラビア数字に変換する新しいロジックステートメントを作成する必要がありました。
このエラーの原因を特定し、問題を解決するためのステートメントを書くのに、約 30 分かかりました。たった 1 つの文字の違いによって、プログラムがこのような状況に適応できるようにするために、多くのテストが必要でした。
私はコンピュータの専門家ではありませんが、興味深いことは、「エラーの解決に多くの時間が費やされる」ということがソフトウェア開発の通常の状態かもしれないということです。
話を元に戻しましょう。これはデータ抽出の非常に簡単なステップであり、すべての可能性に適応するためにはかなりの作業量が必要です。
もしテキストから「事故の性質」などのデータを抽出する場合、おそらく「事故の性質」を記述する方法はさまざまなものであるかもしれません(現時点では確定していません)。ただし、数字よりも複雑であり、文脈に特定の形式がないかもしれません。もしそうであるなら、正規表現だけでは目的を達成することはできないかもしれません。
正規表現ではこの問題を解決できない場合、私の現時点での情報に基づいて言えることは、名前付きエンティティの単語や意味論的な論理関係を認識し、機械に文を理解させ、事故原因を分類するために、複雑な NLP(自然言語処理)技術が必要になるということです。そして、このルールセットには、コードが理解できるようにするために既知のデータベースが事前に設定されている必要があります。
もし本当に NLP 技術を使用してすべての事故報告書から「事故原因」を抽出する場合、すべてのケースに適応するプログラムを作成するためには、非常に多くの作業量が必要になるでしょう。
なぜこんなに苦労するのか#
私たちがデータを抽出する際にこんなに苦労するのはなぜでしょうか?
答えは明らかです。事故報告書のほとんどの情報は統一された形式で記録されていないからです。もし形式が統一されていれば、各事故報告書に統一されたチェックリストがあれば、各データは 1 つの正規表現で抽出でき、すべてのファイルに適用できるでしょう。
ただし、事故報告書の形式には、秦始皇が中国の歴史上初めて統一された中央集権の封建国家を建設したような偉大な節目はありません。
現在、ChatGPT-4 は必要なデータを自動的に抽出できるはずですが、お金が必要です。私たちの先生は自動認識プログラムを作成するように私たちに依頼していますが、それは少し難しいとしか言えません、笑。
秦始皇の六国統一#
秦始皇は、中国史上初めて統一された中央集権の封建国家を築きました。彼は中国だけでなく、さらに重要なことには文字や通貨の統一を実現しました。
これらの統一は、情報の伝達や規格の統一に役立つだけでなく、中華文化の継承と発展にも貢献しています。
今日、コードを書いている中で、「两」という文字によって引き起こされたエラーや、「事故の性質」の抽出にかかる作業量について考えました。これは、統一された基準が見えない問題を解決することができる可能性があることを示しているのではないでしょうか。
私はその答えが肯定的だと考えています。