0

演奏についての質問が気になります。

$textいくつかの文の英語のテキストを含むphp 文字列があります。問題を単純化するために、各文が「.」で終わると仮定しましょう。のような他の記号はありません。! など。

$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は 2 次元配列です。

$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 に答える