【问题标题】:How to replace and count frequency of a word or word sequence?如何替换和计算单词或单词序列的频率?
【发布时间】:2011-04-24 09:44:42
【问题描述】:

我需要做两件事,首先,找到一个给定的文本,它是最常用的词词序列(限于n)。 示例:

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;整数 euismod scelerisque quam, et aliquet nibh dignissim at。 Pellentesque ut 精英 neque。 Etiam facilisis nisl eu mauris luctus in consequat libero volutpat。 Pellentesque 拍卖师,justo in suscipit mollis,erat justo sollicitudin ipsum,在 cursus erat ipsum id turpis。在 tincidunt hendrerit scelerisque。

(有些词我被省略了,但这是一个例子)。

我希望结果是 sit amet 而不是 sitamet

关于如何开始的任何想法?

其次,我需要将从给定列表中匹配的所有单词或单词序列包装在给定文件中。

为此,我认为通过降低长度对结果进行排序,然后在替换函数中处理每个字符串,以避免在我有另一个 sit 单词时包装 sit amet在我的清单中。 这是一个好方法吗?!

谢谢

【问题讨论】:

标签: php nlp word frequency-analysis word-frequency


【解决方案1】:

前段时间我尝试解决第一部分,请参见此处:

http://corexii.com/freqwordseq/

Lorem Ipsum 的示例(不是你的,而是他们中的一个):

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

这很慢,但这是一个开始。您要做的是权衡匹配,以便匹配中的单词越多,权重越高,以使序列比构成这些序列的单个单词更重要。然后你可能想要优化例程。

【讨论】:

  • 像魅力一样工作,非常感谢您提供脚本。
【解决方案2】:

这是一个功能性解决方案,仍然需要进行一些清理。我的一般算法是这样的:

  1. 将所有单词分解成一个列表w, 去除多余的空白和 标点符号
  2. 找到所有n-length的数组 从偏移量 0 开始的 w
  3. 找到所有n-length的数组 从偏移量 1 开始的 w
    • ... 继续直到找到从偏移量 n-1
    • 开始的 n 长度块数组
    • 注意:如果w的最后一个chunk不是n-length,不要将它包含在chunk数组中
  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);

【讨论】:

    猜你喜欢
    • 2013-12-28
    • 2015-06-06
    • 2019-01-27
    • 2015-01-07
    • 2023-03-22
    相关资源
    最近更新 更多