我想使用像''这样的fullstops将文本拆分成句子。 。但如果文本中存在“博士”,“太太”,“美国”等词语,那么分词者可能会感到困惑。例如,请考虑以下文本:
先生。比恩是英国喜剧电视连续剧。
这分为两句话: 1:先生 2:Bean是英国喜剧电视连续剧。
有没有一种聪明的方法可以在PHP中解决这个问题而不使用这些特殊单词的字典/数组?
BTW,我使用以下代码检查给定的单词是否有fullstop。这段代码工作正常,但我需要用很多这样的单词填充字典/数组。我正在寻找一个不需要任何字典的解决方案。现在,有什么想法吗?
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;
}
}
答案 0 :(得分:2)
不要劝阻你,但实际上这是不可能的。请考虑以下句子:
Griffins住在Spooner St.,辛普森一家住在Evergreen St。
除非你愿意依赖更多不可靠的标记,比如大写,否则你必须承认你可以告诉第二个句号的唯一方法是标记缩写的结尾和句子的结尾,而第一个标记只标记首先是全面的句法分析,这是用自然语言无法实现的。
(是的,我知道辛普森一家住在Evergreen Terrace ,但我想说明问题。)
答案 1 :(得分: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);
Heres是我目前的设置:
$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所在的位置)
../
将返回目录并加载包含以下内容的文本文档:
先生,先生,主,DOC,医生,PHD