-4

我想使用像“。”这样的句号将文本分成句子。. 但是如果文本中存在“博士”、“夫人”、“美国”等词,那么拆分器可能会混淆。例如,考虑以下文本:

憨豆先生是一部英国喜剧电视连续剧。

这分为两句话:1:先生2:Bean是一部英国喜剧电视连续剧。

在不使用此类特殊单词的字典/数组的情况下,是否有一种聪明的方法可以在 PHP 中解决这个问题?

顺便说一句,我使用以下代码检查给定单词是否有句号。这段代码工作正常,但我需要用很多这样的词填充字典/数组。我正在寻找不需要任何字典的解决方案。现在,有什么想法吗?

public function doesWordHasFullstop($word){
if(in_array(strtolower(trim($word)), array('dr.','mr.','mrs.','prof.','ms.','sr.','jr.','m.sc.'
                              ,'b.sc.','ph.d.','st.', 'gen.','sen.','rep.','jan.',
                              'feb.','mar.', 'apr.','jun.','jul.','aug.','sep.',
                              'oct.','nov.','dec.','drs.','m.d.','b.a.','m.a.','d.d.s.',
                              'u.s.a','u.a.e','u.k.','p.m.','a.m.'))){
    return FALSE;
}
preg_match('/[.,;):>\]?!@#|]+/', $word, $matches);
if(count($matches)>0){
    return TRUE;
}else{
    return FALSE;
}

}

4

2 回答 2

3

不是要劝阻你,但这实际上是不可能的。考虑以下句子:

格里芬一家住在斯普纳街,辛普森一家住在常青街。

除非您愿意依赖越来越不可靠的标记,例如大写,否则您必须承认唯一可以判断第二个句点同时标记缩写词和句子结尾的方法,而第一个标记只有第一个句点是有了全面的句法分析,这在自然语言中是不可能的。

(是的,我知道辛普森一家住在 Evergreen Terrace,但我想说明这个问题。)

于 2013-11-12T17:53:57.833 回答
0

好吧,您不能使用字典,而是使用数组。

function SplitAtSentance($Criteria,$Word){
    $Word = explode (" ",$Word);
    foreach ($Criteria AS $Keys => $Values){
        if (in_array($Values,$Word)){
            $New = implode(" ",$Word);
            return str_replace($Values, $Values."<br>",$New);
        }
    }
    return false;

}

$Array = array ("Mr","ms");
$Original = "Mr Daryl";

echo SplitAtSentance($Array,$Original);

这是我目前的设置:

$Contents = file_get_contents("../test.txt");
function SplitAtSentance($Criteria,$Word){
$Word = explode (" ",$Word);
foreach ($Criteria AS $Keys => $Values){
    if (in_array($Values,$Word)){
        $New = implode(" ",$Word);
        return str_replace($Values, $Values."<br>",$New);
    }
}
return false;

}

$Contents = explode(",",$Contents);
$Sentance = "Dear mr Gill";
echo SplitAtSentance($Contents,$Sentance);

和文件结构:HTDOCS/TextDoc(片段所在的位置) HTDOCS(text.txt 所在的位置)

../返回一个目录并加载包含以下内容的文本文档:

先生,先生,硕士,博士,博士,博士

于 2013-11-12T17:37:35.897 回答