質問

私は2つのことをする必要があります。最初に、最も使用されている単語である特定のテキストを見つけます 単語シーケンス(に制限されています n)。例:

ロレム *ipsum*ドロール AMETを座ります, 、補給エリットの脂肪が切断されます。 nunc auctor urna sed urna mattis nec interdum magna ullamcorper。 Donec ut ロレム エロス、id rhoncus nisl。賞賛者のソダレス ロレム Vitae Sapien Volutpat et Accumsan ロレム viverra。プロインレクトス エリート, 、Carsus ut Feugiat ut、Porta AMETを座ります レオ。 Cras est nisl、Aliquet quis lobortis AMETを座ります, 、viverra non erat。前庭ante ipsum Faucibus Orci Luctus et Ultrices Posuere Cubilia curaeの原始; Integer Euismod Scelerisque Quam、et aliquet nibh Dignissim at。 ペレンテスク ut エリート ネケ。 Etiam Ficilisis nisl eu Mauris Luctus in ribero volutpat。 ペレンテスク Auctor、Suscipit MollisのJusto、Erat Justo Sollictudin ipsum, 、CARSUS ERATで ipsum id turpis。 Tincidunt Hendrerit Scelerisqueで。

(私のいくつかの言葉は省略されていますが、それは例です)。

一緒になりたいです AMETを座ります そしてそうではありません 座るアメット

開始方法に関するアイデアはありますか?

次に、特定のファイルの特定のリストから一致するすべての単語または単語シーケンスをラップする必要があります。

このために、私は下の長さで結果を注文し、その後、交換関数で各文字列を処理して、持つことを避けると思います AMETを座ります 別のものがある場合は包まれています 座る 私のリストの言葉。それは良い方法ですか?!

ありがとうございました

役に立ちましたか?

解決

私はしばらく前に最初の部分を解決しようとしました、こちらを参照してください:

http://corexii.com/freqwordseq/

Lorem Ipsumの例(あなたのものではなく、emの1つ):

http://corexii.com/freqwordseq/?file=loremipsum&minfreq=2&minseq=1&maxseq=4

かなり遅いですが、スタートです。あなたがやりたいことは、試合の単語が多いほど、より高い重量で、それらのシーケンスを構成する個々の単語よりもシーケンスをより重要にすることです。そして、あなたはおそらくルーチンを最適化したいと思うでしょう。

他のヒント

これは、クリーンアップを使用できる機能的なソリューションです。私の一般的なアルゴリズムはこれです:

  1. すべての単語をリストに爆発させます w、過剰な空白と句読点を剥ぎ取ります
  2. すべての配列を見つけます n- 長さのチャンク w オフセット0から始まります
  3. すべての配列を見つけます n- 長さのチャンク w オフセット1から始まります
    • ...配列が見つかるまで続行します n- オフセットから始まる長さのチャンク n-1
    • 注:最後のチャンクの場合 w ではありません n- 長さ、チャンクアレイの一部として含めないでください
  4. すべてのチャンクアレイを連結します c
  5. すべての値の頻度を見つけますc

$sample = 'Lorem *ipsum* dolor sit amet, consectetur adipiscing elit. Nunc auctor urna sed urna mattis nec interdum magna ullamcorper. Donec ut lorem eros, id rhoncus nisl. Praesent sodales lorem vitae sapien volutpat et accumsan lorem viverra. Proin lectus elit, cursus ut feugiat ut, porta sit amet leo. Cras est nisl, aliquet quis lobortis sit amet, viverra non erat. Vestibulum ante ipsum  primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer euismod scelerisque quam, et aliquet nibh dignissim at. Pellentesque ut elit neque. Etiam facilisis nisl eu mauris luctus in consequat libero volutpat. Pellentesque auctor, justo in suscipit mollis, erat justo sollicitudin ipsum, in cursus erat ipsum id turpis. In tincidunt hendrerit scelerisque.';

function buildPhrases($string, $length) {

    $onlyWords = preg_replace('/\p{P}/', '', $string);
    $wordArray = preg_split('/\s+/s', $onlyWords);

    function buildPhraseChunks($wordArray, $length, $offset = 0)    
    {
        if ($offset >= $length) {
            return array();
        } else {
            $offsetWordArray = array_slice($wordArray, $offset);
            return array_merge(
                array_chunk($offsetWordArray, $length),             
                buildPhraseChunks(
                    $wordArray, $length, $offset + 1
                )
            );
        }
    }

    $onlyLengthN = function ($n) {
        return function($a) use ($n) {
            return count($a) == $n;
        };
    };

    $concatWords = function ($a, $b) {
        return $a . ' ' . $b;
    };

    $reduce = function ($a) use ($concatWords) {
        return array_reduce($a, $concatWords);
    };

    $format = function ($a) {
        return strtolower(trim($a));
    };

    $chunks = array_filter(
        buildPhraseChunks($wordArray, $length),
        $onlyLengthN($length)
    );
    $phrases = array_map($reduce, $chunks);
    $formattedPhrases = array_map($format, $phrases);

    return $formattedPhrases;

}

$phrases = buildPhrases($sample, 1);
$dropOnes = function($a) {
    return $a != 1;
};
$freqCount = array_filter(
    array_count_values($phrases),
    $dropOnes
);

arsort($freqCount);

print_r($freqCount);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top