0

我很好奇关于性能的问题。

有一个 php 字符串$text,其中包含几个句子的英文文本。为了简化问题,让我们猜测每个句子都以“.”结尾。总是,并且没有其他符号,例如,?!等文中。

$sentences = array();
$sentences = explode(". ",  $text);//we split the text into array of sentences

$words = array();
for ($i=0; $i<count($sentences); $i++){
   $words[$i] = explode(" ",  $sentences[$i]);//split each sentence into words
}

所以,$words是一个二维数组。

$words[$i][$j]是句子#i 中的单词#j。正确的?

问题是:

通过字符串中字母的位置找到单词坐标的最快方法是什么?

所以,如果我们有文字:

I go to school. And you.


$word = positionFinder(0);//I  $word == array(0,0)  - the zero word in the zero sentence
$word = positionFinder(1);//' ' $word == array(-1," ")  or something like that
$word = positionFinder(6);//to $word == array(0,2)
$word = positionFinder(9);//school $word == array(0,3)
$word = positionFinder(10);//school $word == array(0,3)
$word = positionFinder(14);//. $word == array (-1,".") or something like that
$word = positionFinder(17);//And $word == array(1,0) - the zero word in the first sentence

我相信为了获得更好的性能,可以使用额外数组中的一些数据。该positionFinder函数的使用次数将超过文本中的单词数。所以positionFinder应该尽可能快地工作。

所以这是一种通过字母来查找单词坐标的方法。有任何想法吗?

谢谢你。

4

1 回答 1

1

您可以执行以下操作:

function positionFinder($text, $n) {
    $s=$text[$n];
    $i=0;
    $sep = array(" ", ".")
    while (!in_array($text[$n-$i],$sep)) {
        $s = $text[$n+$i].$s;
        $i++;
    }
    $i=1
    while (!in_array($text[$n+$i],$sep)) {
        $s .= $text[$n+$i];
        $i++;
    }
    return s;
}

但是,如果您创建一个“positionFinder”数组,例如:

function makearray($text) {
    $sentences = explode(". ",  $text);
    $positionFinder = array();
    $slen = 0;
    for ($i=0; $i<count($sentences); $i++) {
       $words[$i] = explode(" ",  $sentences[$i]);
       for ($ii=0; $ii<count($words[$i]); $ii++) {
           $positionFinder[$slen] = $words[$i][$ii];
           $slen += strlen($words[$i])+1; //+1 because of " "
       }
       $slen+=strlen($sentences[$i])+2; //+2 because of ". "
    }
    return $positionFinder;
}

我需要一些时间来制作数组,但是检查它会非常快:

$text="I go to school. And you. ";
$positionFinder = makearray($text);
echo $positionFinder[0];
>>  I
echo $positionFinder[2];
>>  go
...
于 2013-08-31T00:54:52.230 回答