Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中的短语分割算法_Php - Fatal编程技术网

PHP中的短语分割算法

PHP中的短语分割算法,php,Php,不知道怎么解释。让我们举个例子。说我想把句子分开 “今天是个好日子。” 进入 其思想是在一个句子中获得所有的顺序组合 我一直在想用PHP做这件事最好的方法是什么。任何想法都欢迎 使用php函数explode将其拆分为一个单词数组。然后使用两个嵌套循环。外一个(i)穿过数组标记(0..count(array)-1),大约是输出行中的第一个字。内环(j)从i+1到数组的长度。然后在内部循环中,您必须将单词从i输出到j-1。使用内爆来实现这一点。在从i到j-1的单词数组的子数组上使用它。您可以使用ar

不知道怎么解释。让我们举个例子。说我想把句子分开

“今天是个好日子。”

进入

其思想是在一个句子中获得所有的顺序组合


我一直在想用PHP做这件事最好的方法是什么。任何想法都欢迎

使用php函数explode将其拆分为一个单词数组。然后使用两个嵌套循环。外一个(i)穿过数组标记(0..count(array)-1),大约是输出行中的第一个字。内环(j)从i+1到数组的长度。然后在内部循环中,您必须将单词从i输出到j-1。使用内爆来实现这一点。在从i到j-1的单词数组的子数组上使用它。您可以使用array_slice获取它,下面是一个示例:

$sentence = 'Today is a great day.';

// Only leave "word" characters and whitespace
$sentence = preg_replace('/[^\w\s]+/', '', strtolower($sentence));

// Tokenize
$tokens = explode(' ', $sentence);

for($i = 0; $i < count($tokens); $i++) {
    for($j = 1; $j <= count($tokens) - $i; $j++) {
        echo implode(' ', array_slice($tokens, $i, $j)) . "<br />";
    }
}
递归方法:

function iterate($words) {
    if(($total = count($words)) > 0) {
        $str = '';
        for($i = 0; $i < $total; $i++ ) {
            $str .= ' ' . $words[$i];
            echo $str . PHP_EOL;
        }
        array_shift($words);
        iterate($words);
    }
}

$text = "Today is a great day.";
$words = str_word_count($text, 1);
iterate($words);
函数迭代($words){
如果($total=count($words))>0){
$str='';
对于($i=0;$i<$total;$i++){
$str.=''.$words[$i];
echo$str.PHP\u EOL;
}
数组移位($words);
迭代($words);
}
}
$text=“今天是伟大的一天。”;
$words=str_word_count($text,1);
迭代($words);
以上只会考虑词语。它不会删除重复项。数字不是单词,标点符号也不是。对于给定的五个单词的测试句子,递归方法的执行速度明显快于
数组拼接
解决方案。然而,每增加一个单词,这个数字就会显著增加。在我的机器上用一个十个单词的句子快速完成基准测试,几乎用了一半的时间


免责声明:独立的基准测试取决于许多因素,可能会在不同的机器上产生不同的结果。如果有的话,他们可以给出代码性能的指标(通常在微优化领域),但仅此而已; $pieces=爆炸(“”,strtolower($短语)); $sets=array();
对于($i=0;$iI),我确信有一种奇特的递归方法可以做到这一点。如何处理重复的单词:“这很容易,是吗?”?数字被认为是单词吗?标点符号呢?复制很容易。将它们放入一个数组中,得到唯一的数组。我不知道的是如何将所有的组合放入一个数组中。+1易于阅读和理解,即不过度设计:)但是,为一个代码高尔夫游戏提供了一个很好的基础。code>array_slice价格不菲。@jensgram可以自由发起这样的游戏:)@SalatheHMMM,是的。明天,也许:)@jensgram:aww,不是每个人都在周末:(
today
today is
today is a
today is a great
today is a great day
is
is a
is a great
is a great day
a
a great
a great day
great
great day
day
function iterate($words) {
    if(($total = count($words)) > 0) {
        $str = '';
        for($i = 0; $i < $total; $i++ ) {
            $str .= ' ' . $words[$i];
            echo $str . PHP_EOL;
        }
        array_shift($words);
        iterate($words);
    }
}

$text = "Today is a great day.";
$words = str_word_count($text, 1);
iterate($words);
$phrase = 'Today is a great day';
$pieces = explode(' ', strtolower($phrase));
$sets = array();
for ($i=0; $i<count($pieces);$i++) {
    for ($j=0; $j<count($pieces);$j++) {
        if ($i<=$j)
            $sets[$i][] = $pieces[$j];
    }
}
print "<ul>";
foreach($sets as $set) {
    while(count($set) > 0) {
        print "<li>" . implode(' ', $set) . "</li>\n";
        array_pop($set);
    }
}
print "</ul>";