0

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

Lorem * ipsum * dolor sit amet、consecteturadipiscingelit。Nunc auctor urna sed urna mattis nec interdummagnaullamcorper。Donec ut lorem eros、idrhoncusnisl。Praesent sodales lorem vitae sapien volutpat et accumsanloremviverra。Proin lectus elit、cursus ut feugiat ut、porta sitametleo。Cras est nisl、aliquet quis lobortis sit amet、viverranonerat。faucibus orci luctus et ultrices posuerecubiliaCuraeのVestibulumanteipsum primis ; 整数euismodscelerisquequam、et aliquet nibhdignissimat。Pellentesque ut elitneque。Etiam facilisis nisl eu mauris luctus in consequatliberovolutpat。Pellentesque auctor、suscipit mollisのjusto、erat justo sollicitudin ipsum、 cursus erat ipsumidturpis。tincidunthendreritscelerisqueで。

(一部の単語は省略されていますが、これは例です)。

座ってアメットではなく、シットアメット結果を出したい

始める方法について何かアイデアはありますか?

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

このため、リストに別の座る単語がある場合に座るアメットがラップされるのを避けるために、長さを降順で結果を並べ替えてから、置換関数で各文字列を処理すると思います。それは良い方法ですか?!

ありがとうございました

4

2 に答える 2

0

私は少し前に最初の部分を解決しようとしました、ここを見てください:

http://corexii.com/freqwordseq/

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

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

かなり遅いですが、それは始まりです。一致する単語が多いほど重みが高くなり、シーケンスを構成する個々の単語よりもシーケンスの重要性が高くなるように、一致の重みを設定します。そして、おそらくルーチンを最適化する必要があります。

于 2010-10-12T16:16:51.523 に答える
0

これは、まだある程度のクリーンアップを使用できる機能的なソリューションです。私の一般的なアルゴリズムは次のとおりです。

  1. すべての単語をリストwに分解し、余分な空白と句読点を取り除きます
  2. オフセット0から始まるwのすべてのn長のチャンクの配列を見つけます
  3. オフセット1から始まる wのすべてのn長のチャンクの配列を見つけます
    • ...オフセットn -1で始まるn個の長さのチャンクの配列が見つかるまで続行します
    • 注: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);
于 2010-10-12T16:43:44.070 に答える