2017-04-24 27 views
2

問題は、テキストファイルをPHPを使用して文章で分割しようとしていることです。引用を含むテキストファイルの解析

[0] In his book The Symposium, Plato wrote “Those who are halves of a man whole pursue males, and being slices, so to speak, of the male, love men throughout their boyhood, and take pleasure in physical contact with men” (qtd. 
[1] in Isay 11). 

別の例は次のとおりです:

In his book The Symposium, Plato wrote “Those who are halves of a man whole pursue males, and being slices, so to speak, of the male, love men throughout their boyhood, and take pleasure in physical contact with men” (qtd. in Isay 11). 

それはこのようにそれを分割します。問題は、これらのような文章であることである

$results = preg_split('/(?<=[.?!])\s+/', $stringtest, -1, PREG_SPLIT_NO_EMPTY); 

:私は現在、次の関数を使用して

Dr. Evelyn Hooker, a heterosexual psychologist... 

Dr.の部分が問題になります。

これらのテキストは、すべてNLPのMASCコーパスに記載されています。

+4

あなたの質問は何 –

+0

@JayBlanchard:。。?。私は、OPは句読点に分割したいと思います。しかし、彼ら以来問題の原因となっている別の場所にも存在します。 – Rahul

+0

私は正規表現がこれのための非常に良いツールだとは思わない。 – jrook

答えて

1

@ndn's solutionを拡張して、必要なものを実現することができます。 $before_regexesには既知の略語のリストが含まれ、コーパスに存在する略語を追加することに注意してください。そこにqtdを追加しました。

次に、$before_regexes$after_regexesがペアになっています。 \(で(0+、空白を引用符(”’"'»)を見つけ、その後、(と続く:私は'/(?:[”’"\'»])\s*\Z/u'/'/\A(?:\(\p{L})/u'ペアを添加し、非文境界としてマークされた(第一false$is_sentence_boundaryアレイに正規表現ペア手段。 )と、任意のUnicode文字(\p{L})、その後、スプリットがあってはならない

function sentence_split($text) { 
    $before_regexes = array('/(?:[”’"\'»])\s*\Z/u', 
     '/(?:(?:[\'\"„][\.!?…][\'\"”]\s)|(?:[^\.]\s[A-Z]\.\s)|(?:\b(?:St|Gen|Hon|Prof|Dr|Mr|Ms|Mrs|[JS]r|Col|Maj|Brig|Sgt|Capt|Cmnd|Sen|Rev|Rep|Revd)\.\s)|(?:\b(?:St|Gen|Hon|Prof|Dr|Mr|Ms|Mrs|[JS]r|Col|Maj|Brig|Sgt|Capt|Cmnd|Sen|Rev|Rep|Revd)\.\s[A-Z]\.\s)|(?:\bApr\.\s)|(?:\bAug\.\s)|(?:\bBros\.\s)|(?:\bCo\.\s)|(?:\bCorp\.\s)|(?:\bDec\.\s)|(?:\bDist\.\s)|(?:\bFeb\.\s)|(?:\bInc\.\s)|(?:\bJan\.\s)|(?:\bJul\.\s)|(?:\bJun\.\s)|(?:\bMar\.\s)|(?:\bNov\.\s)|(?:\bOct\.\s)|(?:\bPh\.?D\.\s)|(?:\bSept?\.\s)|(?:\b\p{Lu}\.\p{Lu}\.\s)|(?:\b\p{Lu}\.\s\p{Lu}\.\s)|(?:\bcf\.\s)|(?:\be\.g\.\s)|(?:\besp\.\s)|(?:\bet\b\s\bal\.\s)|(?:\bvs\.\s)|(?:\p{Ps}[!?]+\p{Pe}))\Z/su', 
     '/(?:(?:[\.\s]\p{L}{1,2}\.\s))\Z/su', 
     '/(?:(?:[\[\(]*\.\.\.[\]\)]*))\Z/su', 
     '/(?:(?:\b(?:pp|[Vv]iz|i\.?\s*e|[Vvol]|[Rr]col|maj|Lt|[Ff]ig|[Ff]igs|[Vv]iz|[Vv]ols|[Aa]pprox|[Ii]ncl|Pres|[Dd]ept|min|max|[Gg]ovt|lb|ft|c\.?\s*f|vs|qtd)\.\s))\Z/su', 
     '/(?:(?:\b[Ee]tc\.\s))\Z/su', 
     '/(?:(?:[\.!?…]+\p{Pe})|(?:[\[\(]*…[\]\)]*))\Z/su', 
     '/(?:(?:\b\p{L}\.))\Z/su', 
     '/(?:(?:\b\p{L}\.\s))\Z/su', 
     '/(?:(?:\b[Ff]igs?\.\s)|(?:\b[nN]o\.\s))\Z/su', 
     '/(?:(?:[\"”\']\s*))\Z/su', 
     '/(?:(?:[\.!?…][\x{00BB}\x{2019}\x{201D}\x{203A}\"\'\p{Pe}\x{0002}]*\s)|(?:\r?\n))\Z/su', 
     '/(?:(?:[\.!?…][\'\"\x{00BB}\x{2019}\x{201D}\x{203A}\p{Pe}\x{0002}]*))\Z/su', 
     '/(?:(?:\s\p{L}[\.!?…]\s))\Z/su'); 
    $after_regexes = array('/\A(?:\(\p{L})/u', 
     '/\A(?:)/su', 
     '/\A(?:[\p{N}\p{Ll}])/su', 
     '/\A(?:[^\p{Lu}])/su', 
     '/\A(?:[^\p{Lu}]|I)/su', 
     '/\A(?:[^p{Lu}])/su', 
     '/\A(?:\p{Ll})/su', 
     '/\A(?:\p{L}\.)/su', 
     '/\A(?:\p{L}\.\s)/su', 
     '/\A(?:\p{N})/su', 
     '/\A(?:\s*\p{Ll})/su', 
     '/\A(?:)/su', 
     '/\A(?:\p{Lu}[^\p{Lu}])/su', 
     '/\A(?:\p{Lu}\p{Ll})/su'); 
    $is_sentence_boundary = array(false, false, false, false, false, false, false, false, false, false, false, true, true, true); 
    $count = 13; 

    $sentences = array(); 
    $sentence = ''; 
    $before = ''; 
    $after = substr($text, 0, 10); 
    $text = substr($text, 10); 

    while($text != '') { 
     for($i = 0; $i < $count; $i++) { 
      if(preg_match($before_regexes[$i], $before) && preg_match($after_regexes[$i], $after)) { 
       if($is_sentence_boundary[$i]) { 
        array_push($sentences, $sentence); 
        $sentence = ''; 
       } 
       break; 
      } 
     } 

     $first_from_text = $text[0]; 
     $text = substr($text, 1); 
     $first_from_after = $after[0]; 
     $after = substr($after, 1); 
     $before .= $first_from_after; 
     $sentence .= $first_from_after; 
     $after .= $first_from_text; 
    } 

    if($sentence != '' && $after != '') { 
     array_push($sentences, $sentence.$after); 
    } 

    return $sentences; 
} 

PHP demoを参照してください

関連する問題