Bir metin (PHP) alıntılar ayıklamak nasıl?

3 Cevap php

Hello!

Ben bir metinden tüm atıfları ayıklamak istiyorum. Buna ek olarak, bahsedilen kişinin ismi ekstre edilmelidir. DayLife does this very well.

Example:

"Onlar düşünüyorum 'oyun bitti'," bir üst düzey yönetim yetkilisi söyledi.

Ifade They think it's 'game over' ve adı geçen kişinin one senior administration official ekstre edilmelidir.

Eğer bu mümkün mü? Bahsettiğiniz Atıf kişi var olup olmadığını kontrol eğer sadece alıntılar ve tırnak sözcüklerin ayırt edebilirsiniz.

Example:

"Ben ciddi olduğunu ve bozulan düşünüyorum," Amiral Mullen, CNN'in "Birliğin Durumu" programında Pazar söyledi.

Pasaj State of the Union bir tırnak değildir. Ama nasıl bu tespit ediyorsunuz? sözü bir atıf kişi varsa a) kontrol edin. b) sözde tırnak içinde boşluk saymak. Az 3 boş alanlar varsa bu doğru, bir tırnak olmayacak? Adında bir atıf kişi her zaman orada değil çünkü ben b) tercih ederim.

How to start?

Daha sonra sadece bir alıntı işareti kontrol etmek gerekir ki ben ilk, tek bir türe göre tırnak her türlü yerini alacak.

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

Sonra fazla 3 boşluk içeren tırnak işaretleri arasındaki tüm ifadeler ayıklamak olacaktır:

<?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();
}
?>

Bunu nasıl artırabilirsiniz?

Bana yardımcı olur umarım. Şimdiden çok teşekkür ederiz!

3 Cevap

Ceejayoz zaten işaret gibi, bu tek bir fonksiyonun içine sığmaz. Eğer (bir cümle alıntı öncelemeli kısmının gramer algılama işlevi - yani "Birliğin Durumu" vs "Ben, bunun ciddi olduğunu ve bozulan olduğunu düşünüyorum") senin soru açıklayan şeyin iyi bir kütüphane ile çözülmüş olurdu Bu belirteçleri içine doğal dili yıkmak olabilir. PHP böyle bir kütüphane farkında değilim, ama sen Python kullanmak istiyorsunuz şey proje boyutuna bir göz olabilir: http://www.nltk.org/

Ben yapabileceğiniz en iyi el doğrulamak sözdizimi kurallarının bir dizi tanımlamak olduğunu düşünüyorum. Ne bu böyle bir şey:

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...

Eğer yukarıdaki gibi bir yapı varsa bunlardan herhangi / tüm aracılığıyla aynı metni çalıştırın ve doğru olanları seçmek mümkün alıntılar listeleyebilirsiniz. Ben test ve sonucu için giriş olarak bu konu ile kod çalıştırmak:

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) ""
  }
}

Az 3 boş alanlar varsa bu doğru, bir tırnak olmayacak?

"İlle," ceejayoz dedi.

The passage State of the Union is not a quotation. But how do you detect this? a) You check if there's a cited person mentioned. b) You count the blank spaces in the supposed quotation. Az 3 boş alanlar varsa bu doğru, bir tırnak olmayacak? I would prefer b) since there's not always a cited person named.

b) bile bu çok örneğin çalışmıyor - "Birliğin Durumu" 3 boşluk vardır.

, Sonunda bir virgül ya Konuşmacının adı veya başlığı takip etmek olduğunu belirtmek için, ya da cümlenin sonuna - Bir tırnak hep noktalama olacak (.!?).