2016-05-24 8 views
1

私の大学卒業論文で記事(要約アプリケーション)から主なアイデアを抽出するWebアプリケーションを作成することにしました。それはPHPで構築されています。いくつかの単語がない別の文に基づいて文章を抽出する

しかし、私は解決策が見つからない状況に遭遇しました。多分、皆さんが私に問題の解決策を教えてくれるかもしれません。 最初に、私はすべてのストップワードを削除するという意味でテキストを「サニタイズ」します。私は単語を抹消します。省略形やイニシャルを削除することができます。 。文章を正しく壊さないようにすることができます。 その後、私は文章を文章にして.トークンで爆破し、すべての文章を配列にします。 ここで私は文章に格付けを "付与"するプロセスがありますが、基本的にこれは記事で最も関連性の高い文章を見つける方法です。評価の高い文章は通常記事の主なアイデアを含むものです。

しかし私の問題は今始めます。私が評価した文章は、私がすべての「墨塗り」を適用したものであり、元の形ではありません。私は最高の定格文を取って、それに基づいて、この定格文が一致するテキストから元の文を抽出したいと考えています。私は正規表現とそれを一致させることを試みたが、それは常に動作しません。私は最高の定格文に基づいて記事から元の文を抽出する100%作業方法が必要です。

これを達成する方法はわかりません。評価された文章は、それから単語を逃すためです。 私があなたの意見を理解してくれることを願っています。ありがとうございました。

EDIT

: これは私が今記事で原文と一致するために使用する機能ですが、私は常に動作しません:

private function get_original_sentence($s, $t) 
    { 
     $s = preg_replace("/[^A-Za-z0-9 ]/", '', $s); 
     $s = trim($s); 

     $arr = explode(" ",$s); 
     $f_word = $arr[0]; 
     $l_word = $arr[count($arr)-1]; 

     preg_match('~(?<=\.)([a-zA-Z ]*)'.$f_word.'(.*?)'.$l_word.'([a-zA-Z ]*)(?=\.)~i', $t, $matches); 

     if(empty($string)) 
     { 
      preg_match('~(?<=\.)([^\.]*)'.$f_word.'(.*?)'.$l_word.'([^\.]*)(?=\.)~i', $t, $matches); 
     } 

     return $matches[0] ? $matches[0] : false; 
    } 

$sパラメータが要約と$t後の定格文であります元の完全な記事です。

EDIT 2:略語だけでなく、テキスト全体を実際に消毒する略語除去機能。

static private function _remove_abbrev($subject) 
    { 
     $domains = '\.ro|\.com|\.edu|\.org|\.gov'; 

     foreach(self::$abrv as $abrv) 
     { 
      $not.= strtolower(str_replace('.', '\.', $abrv)).'|'; 
      $not.= strtolower(trim(str_replace('.', '\.', $arbv))).'|'; 
     } 

     $not = substr($not, 0, -1); 

     //$subject = preg_replace('~(\".*?\")~u', '', strtolower($subject));//replaces " " from text. 
     $subject = preg_replace('~(?<=\.|^)(?![^\.]{60,})[^\.&]*\&[^\.]*\.?~u', '', strtolower($subject)); 
     $subject = preg_replace('~\b\s?[\dA-za-z\-\.]+('.$domains.')~u', '', strtolower($subject)); 
     $subject = preg_replace('~\s*\(.*?\)\s*~u', '', strtolower($subject)); 
     $subject = preg_replace('~\b('.$not.')~u', '', strtolower($subject)); 
     $subject = preg_replace('~(?<=[^a-z])[A-Za-z]{1,5}+\.[\s\,]*(?=[a-z]|[0-9])~u', '', strtolower($subject)); 
     $subject = preg_replace('~(?<=[\s\,\.\:])([A-Za-z]*(\.)){2,}+(.)(?=.*)~u', '', strtolower($subject)); 
     $subject = preg_replace('~(\d)+\.(\d)*(\s)~u', '', strtolower($subject)); 

     return $subject; 
    } 

これは略語アレイコレクションです:

static public $abrv = array(
     ' alin.', ' art.', ' A.N.P', ' A.V.A.B', ' A.V.A.S.', ' B.N.R', ' c.', ' C.A.S', ' C.civ.', ' C.com.', ' C.fam.', ' C.pen.', ' C.pr.civ.', ' C.pr.pen', ' C.N.C.D', ' C.N.V.M', ' C.N.S.A.S', ' C.S.M', ' C.S.J', ' D.G.F.P', ' D.G.P.M.B', ' D.N.A', ' D.S.V', 'Ed.', ' etc.', ' H.G.', ' I.G.P.F', ' I.G.P.R', ' I.N.M.L.', ' I.P.J', ' I.C.C.J', ' lit.', ' M.Ap.N.', ' art.', ' M.J.', ' M.Of.', ' nr.', ' O.G.', ' O.U.G.', ' p.', ' P.N.A.', ' par.', ' pct.', ' R.A.A.P.P.S.', ' subl. ns.', ' S.C.', ' S.A.', ' S.P.P.', ' S.R.I.', ' S.R.L.', 'U.N.B.R.', ' urm.', ' str.', ' sec.', ' pag.', ' a.c.', ' dv.', ' dvs.', ' prof.', ' conf.', ' dr.', ' drd.', ' mrd.', ' s.a.m.d' 
    ); 
+0

@FrayneKonokはコードで答えを編集しました。 – southpaw93

+0

はい、今、人々があなたを助けることができます参照してください。 –

+0

私は文章にユニークなidsを割り当てるべきだと思います。 – noreabu

答えて

0

どのようにこのアプローチについて:あなたが最初の数値インデックス$置換 と配列にpreg_match_allですべての一致を抽出

  1. 次に、preg_replace:$ countの4変数を利用して一意のマーカーに置き換えます。その値は$ substitを指しています私は$参照による呼び出し(例えばとしてカウントを参照するための構文を台無しかはわからない

    $count = 0; 
    $substitutions = array(); 
    foreach ($patterns as $pattern) { 
        $matches = array(); 
        preg_match_all($pattern, $subject, $matches); 
        preg_replace($pattern, $subject, '__'.$count.'__', -1, $count); 
    
        foreach ($matches[???] as $match) { 
         $substiutions[] = $match; 
        } 
    } 
    

    :utions配列

ラフコードスケッチドキュメントの& $)。

このアプローチの要点は、$ matches配列から正しい値を抽出することだと思います。どのようにマッチを抽出するか、いくつかのオプションがあります。たぶん別のアプローチは、$ countのサブ配列からpreg_replaceから$ countを使用することではないかもしれません

0

_remove_abbr関数はあまりうまく動作していないようです。文章の最後に「芸術」のような言葉を削除しますが、「C.A.S.」のような略語は削除しません。 (既に "c"を削除しているため)。少なくとも1つのタイプミス($arbv)があり、連結する前に$notを定義していません。

しかし、略語やURLなどを削除する代わりに、空白文字で置き換えてください。そのようにして、テキストを文に分割すると、元のテキストと同じ長さになりますので、文の開始と終了の位置を保存できます。必要に応じて、この時点で複数のスペースを1つのスペースに変換できますが、元のテキストのどこから来たのかは分かります。

あなたはこれを達成するために、コールバック関数が必要になります。

$f = function($m){ return str_repeat(" ", strlen($m[0])); }; 
    $subject = preg_replace_callback('~(?<=\.|^)(?![^\.]{60,})[^\.&]*\&[^\.]*\.?~u', $f, strtolower($subject)); 
    $subject = preg_replace_callback('~\b\s?[\dA-za-z\-\.]+('.$domains.')~u', $f, $subject); 
    $subject = preg_replace_callback('~\s*\(.*?\)\s*~u', $f, $subject); 
    $subject = preg_replace_callback('~\b('.$not.')~u', $f, $subject); 
    $subject = preg_replace_callback('~(?<=[^a-z])[A-Za-z]{1,5}+\.[\s\,]*(?=[a-z]|[0-9])~u', $f, $subject); 
    $subject = preg_replace_callback('~(?<=[\s\,\.\:])([A-Za-z]*(\.)){2,}+(.)(?=.*)~u', $f, $subject); 
    $subject = preg_replace_callback('~(\d)+\.(\d)*(\s)~u', $f, $subject); 
関連する問題