質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • 自然言語処理

    118questions

    自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

テキストや表からの情報抽出

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 804

Katsu-Ishii

score 8

テキストから情報抽出をしたい(非構造データからJSONなどに出力)場合には、どのようなアプローチの方法が良いでしょうか。
ライブラリやAPIがあれば、教えていただければと思います。
言語としては、主にJava、Python考えています。
下記に示している例の表では列の数が、7列ですがこの数を増減できるような作りにもしたいと考えています。
(情報抽出する際のカテゴリを増やしたい)

よろしくお願いいたします。


例). メールの場合

株式会社○○の山田太郎です。
仕事情報をご案内いたします。

【案件名】
XXフォーラム

【勤務地】
東京

【要因】
30名

【作業内容】
・チケット管理
・会場内案内
・会場設置(椅子運び等)

肉体労働もあるので男性の方が好ましいです。
基本的に日中業務ですが、深夜できる方も募集しています。

以上よろしくお願いいたします。


↓↓情報抽出して構造化データにする↓↓

案件名 勤務地 要員 性別 作業内容 勤務時間帯 その他
XXフォーラムイベントスタッフ 東京 30名 男性が好ましい チケット管理, 会場案内, 会場設置(椅子運び等) 日中 深夜できる方も募集中
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2017/11/21 08:07

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 1

checkベストアンサー

+3

テキストから情報抽出をしたい
どのようなアプローチの方法が良いでしょうか

先に断っておくと、固有表現抽出を含めた自然言語処理は、
AIなどと同じ最先端の分野なので、希望通りにできる保証はありません。
もし簡単に汎用化できたら、安価なソフトが商品化されて、とっくに普及してるはずです。

では、どういうアプローチをしたら良いか。概要から言いますと、
情報抽出は部分的には可能なので、ドメインを絞るやり方が良いです。
逆に、汎用的にやろうとするほど、高確率で失敗します。限定してください。

自然言語処理は、人工知能と文字列処理のあいだにありますが、
ドメインを絞ることで、文字列処理に近づけると、実現可能性が高まります。


具体的にどういうことか、ご質問のサンプルで考えてみましょう。

【勤務地】
東京

【要員】
30名

「東京」などの地名の前に、必ず「【勤務地】」が来るなら、
「30名」などの人数の前に、必ず「【要員】」が来るなら、
たんなる文字列処理の問題です。しかし、実務的にはそうではない。

たとえば、【】でくくってくれないかもしれない。
「要員」の代わりに「人数」と表現するかもしれない。
それくらいならまだ、正規表現など文字列処理で対応できます。

さらに、「勤務先は東京になります」になると難しい。
まあこれは一文から勤務先の表現と地名を抜き出せばいいでしょう。

しかし、「東京から送迎バスを出すので、別働隊の埼玉ではなく
千葉行きに乗って向かってください」の勤務先をどうするかは難しい。
意味や文脈が関係してくるからです。

この一文を抜き出すのに、前後の文も判断する必要があるかもしれません。
こうして、正規表現の単純な抽出では、すぐに限界を迎えます。

そもそも、勤務先を「東京、千葉」と並列にして良いのかとか、
集合場所と勤務先は別なのかとか、要件が決まっている必要があります。

そういうわけで、抽出する先の文章の書式が統一されているほど、
文字列処理に近づき、実装しやすくなります。
たとえば、表から表なら位置を変えるだけなので簡単でしょう。

まとめると、決め打ちできる書式をいかに増やすかが重要です。
情報収集するサイトを絞るとか、データの出所が社内なら、
フォーマットを統一するようにしておくとか。


抽出の処理自体にも触れておきましょう。
分類が文字列を入力して、分類基準を出力するのに対して、
抽出は文字列を入力して、部分文字列を出力するのが特徴です。

質問文に処理対象と欲しい処理結果は書いてありますが、
その中間の部分文字列をどう定義するかが処理のポイントです。
「対象の文書(全体文字列) → 部分文字列 → 表などに構造化」という流れ。

この部分文字列とは、たとえば「東京」とか「30名」とかです。
しかしこれは、「神奈川」や「100人」も抜き取りたいので、
「地名」とか「人数」とか抽象化された概念になります。

また、「東京」とか都道府県限定なのか、それとも、
「秋葉原」「新宿」とかでも良いのかなど、要件と関係してきます。
それに、「30名」は「30人」も、「三十名」「三十人」も抜き出したいでしょう。

こういうのを正規表現だけで表現すると、
規模が大きくなるにつれ、非常に複雑になりやすい。

だから、せっかくJavaを使うなら(Pythonなら関数型のやり方でもいいかも)、
オブジェクトで表現したいです。DDDなどでいうドメインモデルです。

私なら、まず「人数」をクラスにして、
さらに、数字部分と単位部分も別のクラスに分けて、
合成して人数にして……と、徹底的に分解していきます。

自然言語処理は非常に複雑で難解になりやすいので、
クラスが増えても、それだけ実装コストを掛ける意味があると思います。

ネストしたIF文と正規表現の嵐だと、結局メンテ不能になっていきます。
一方、部分文字列をオブジェクトの集合で表現すると、それぞれ独立しているので、
変更の対象が分かりやすくなり、変更容易になるのでメンテしやすいです。

まとめると、全体の文書を部分文字列(オブジェクト)の集合に分解して、
後は正規化(30か三十か単位をそろえるなど)し、表などに構造化して出力します。


なお今回、長く難しい話になるので、パース(構文解析)の話題を省略しましたが、
単語単位だけでなく、文法にそって文単位で解析すると、
難度は一気に上がりますが、より本格的な自然言語処理が可能になります。

そして、このパースを視野に入れているから、オブジェクトにしたいのです。
パースでは構文木を作りますが、正規表現では階層構造の表現が難しい。
しかし、クラスは階層構造を表現できます。そのためのクラスです。


ライブラリやAPIがあれば、教えていただければと思います。

形態素解析なら「MeCab」、みたいに定番のライブラリもありますが、
全部APIを叩くだけで済むようなことはまずなく、
普通は泥くさく書く部分が出てくるはずです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/07 16:55

    今更ではありますが、非常にご丁寧な回答をありがとうございました。
    漠然とした目標でしたが、絞っていくことでイメージがつかめました。

    Mecabを入れて、取り組んでみましたが、かなり難しいという事がわかり、今回は断念してしまいました。
    今後の研究にアンテナを張り、いつの日か自身で実現したいと考えています。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    JVMのダンプファイル作成パスがおかしい件

    APサーバ起動時にオプションとして、ダンプファイルを作成するように引数を加えました(パスを/opt/tomcat/logs/jfr/としました。) $java -XX:+Un

  • 受付中

    Spring-bootでtableタグの情報を送受信したい。

    まだ全然調べてないので、走り書き程度の質問です。 Spring-bootでwebアプリを作成しています。 その時クライアント側で「行、列、が可変する表(表が存在しない場

  • 解決済

    複数のテーブルからフィールドの値を取得するには?

    テーブルが2つあり、 主キー member_id になります。 [tableA] member_id name age 1 yamada 20 2 t

  • 解決済

    サーバ側でのキャッシュ管理

    いつもお世話になっております。 webシステム開発初心者です。 今私は、4Dというものを使って十人ぐらいが一斉にアクセスできるwebシステムを作っていて その時のフォームデ

  • 解決済

    顧客の家族や資産を管理するDB設計について

    DB設計はまったくの素人です.   顧客の情報とその顧客の家族、資産を管理するDB設計を行わなくてはならないのですが、 どのように設計したら良いのでしょうか? 現在エクセルにて

  • 解決済

    【単純な質問】Rails データベースの結合について

    各商品・各ブログの投稿にカテゴリーを振り分けて、カテゴリーの絞り込み検索などを行えるシステムを作るとします。 通常、 それぞれの商品や投稿本体ののDB カテゴリーDB

  • 受付中

    チャットでコメントか画像を表示させたいときの設計

    チャットを作りたいと考えているのですがコメントの部分にテキストか画像が来ます。この時の設計はコメントのDBの中に画像のURLのカラムを追加してコメントがなければ画像のカラムを見る以

  • 解決済

    javaでHTMLファイルを分析

    javaでHTMLのファイルを読みだして財務分析をして流動比率というものを調べたいのですが普通に計算したほうが早いのはわかっているのですが、javaでやりたいです! これは読み

同じタグがついた質問を見る

  • 自然言語処理

    118questions

    自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。