3

こんにちは!

テキストからすべての引用を抽出したいと思います。さらに、引用された人物の名前を抽出する必要があります。DayLifeはこれを非常にうまく行っています。

例:

「彼らはそれが『ゲームオーバー』だと思っている」とある政府高官は言った。

彼らはそれが「ゲームオーバー」だと考えているというフレーズと、 1人の上級行政官が引用された人物を抽出する必要があります。

それは可能だと思いますか?引用された人が言及されているかどうかを確認する場合にのみ、引用と引用の単語を区別できます。

例:

「それは深刻で悪化していると思う」とマレン提督は日曜日にCNNの「一般教書演説」プログラムで語った。

一般教書演説は引用ではありません。しかし、これをどのように検出しますか?a)引用された人物が言及されているかどうかを確認します。b)想定される見積もりの​​空白スペースを数えます。空白が3つ未満の場合、引用符にはなりませんよね?私はb)という名前の引用された人が常にいるとは限らないので好むでしょう。

始める方法は?

最初にすべてのタイプの引用符を単一のタイプに置き換えて、後で1つの引用符だけをチェックする必要があるようにします。

<?php
$text = '';
$quote_marks = array('“', '”', '„', '»', '«');
$text = str_replace($quote_marks, '"', $text);
?>

次に、3つ以上の空白を含む引用符の間のすべてのフレーズを抽出します。

<?php
function extract_quotations($text) {
   $result = preg_match_all('/"([^"]+)"/', $text, $found_quotations);
   if ($result == TRUE) {
      return $found_quotations;
      // check for count of blank spaces
   }
   return array();
}
?>

どうすればこれを改善できますか?

あなたが私を助けてくれることを願っています。事前にどうもありがとうございました!

4

3 に答える 3

3

空白が3つ未満の場合、引用符にはなりませんよね?

「必ずしもそうとは限らない」とceejayozは言った。

一般教書演説は引用ではありません。しかし、これをどのように検出しますか?a)引用された人物が言及されているかどうかを確認します。b)想定される見積もりの​​空白スペースを数えます。空白が3つ未満の場合、引用符にはなりませんよね?私はb)という名前の引用された人が常にいるとは限らないので好むでしょう。

b)この例では機能しません-「一般教書演説」には3つの空白スペースがあります。

于 2009-08-24T17:01:24.057 に答える
3

ceejayozがすでに指摘しているように、これは単一の関数に適合しません。質問で説明していること(文の引用符で囲まれた部分の文法機能を検出する-つまり、「深刻で悪化していると思う」と「一般教書演説」)は、ライブラリを使用して解決するのが最適です。自然言語をトークンに分解することができます。私はPHPでそのようなライブラリを知りませんが、Pythonで使用するもののプロジェクトサイズを見ることができます:http ://www.nltk.org/

できる最善のことは、手動で検証する一連の構文規則を定義することだと思います。このようなものはどうですか?

abstract class QuotationExtractor {

    protected static $instances;

    public static function getAllPossibleQuotations($string) {
        $possibleQuotations = array();
        foreach (self::$instances as $instance) {
            $possibleQuotations = array_merge(
                $possibleQuotations,
                $instance->extractQuotations($string)
            );
        }
        return $possibleQuotations;
    }

    public function __construct() {
        self::$instances[] = $this;
    }

    public abstract function extractQuotations($string);

}

class RegexExtractor extends QuotationExtractor {

    protected $rules;

    public function extractQuotations($string) {
        $quotes = array();
        foreach ($this->rules as $rule) {
            preg_match_all($rule[0], $string, $matches, PREG_SET_ORDER);
            foreach ($matches as $match) {
                $quotes[] = array(
                    'quote' => trim($match[$rule[1]]),
                    'cited' => trim($match[$rule[2]])
                );
            }
        }
        return $quotes;
    }

    public function addRule($regex, $quoteIndex, $authorIndex) {
        $this->rules[] = array($regex, $quoteIndex, $authorIndex);
    }

}

$regexExtractor = new RegexExtractor();
$regexExtractor->addRule('/"(.*?)[,.]?\h*"\h*said\h*(.*?)\./', 1, 2);
$regexExtractor->addRule('/"(.*?)\h*"(.*)said/', 1, 2);
$regexExtractor->addRule('/\.\h*(.*)(once)?\h*said[\-]*"(.*?)"/', 3, 1);

class AnotherExtractor extends Quot...

上記のような構造の場合は、それらのいずれか/すべてに同じテキストを実行し、可能な引用をリストして正しいものを選択できます。このスレッドをテストの入力として使用してコードを実行したところ、結果は次のようになりました。

array(4) {
  [0]=>
  array(2) {
    ["quote"]=>
    string(15) "Not necessarily"
    ["cited"]=>
    string(8) "ceejayoz"
  }
  [1]=>
  array(2) {
    ["quote"]=>
    string(28) "They think it's `game over,'"
    ["cited"]=>
    string(34) "one senior administration official"
  }
  [2]=>
  array(2) {
    ["quote"]=>
    string(46) "I think it is serious and it is deteriorating,"
    ["cited"]=>
    string(14) "Admiral Mullen"
  }
  [3]=>
  array(2) {
    ["quote"]=>
    string(16) "Not necessarily,"
    ["cited"]=>
    string(0) ""
  }
}
于 2009-08-27T10:08:14.047 に答える
0

引用符には常に句読点があります。話者の名前または役職が続くことを示すために最後にコンマを付けるか、文の終わり(。!?)を使用します。

于 2009-08-24T17:17:00.297 に答える