基于词频减少文本的算法

时间:2018-05-07 05:37:22

标签: php regex string text logic

如何在PHP中基于词频减少文本?

例如,如果我有这个文字:

house house house house book book book

它应该简化为类似的东西(或任何类似的形式):

house house book

所以这种方式最常用的单词仍然是2,并且按1预订。

2 个答案:

答案 0 :(得分:1)

压缩&在PHP中解压缩字符串:gzcompress,gzuncompress

示例:

$text = "house house house house book book book";
echo "Orignal text lenght : ". strlen($text)."<br>";
$compressed = gzcompress($text, 9);
echo "Compressed text: ".$compressed."<br>";
echo "Compress text length :". strlen($compressed);
echo "<br>";
echo "Uncompressed text :".$uncompressed = gzuncompress($compressed);

<强>输出:

原始文字长度:38

压缩文本:x /-NU R

压缩文字长度:22

未压缩文本:房屋住宅图书书

答案 1 :(得分:1)

问题实际上很有趣。据我了解,它不是关于压缩,而是关于词频 - 这是我的朋友,是自然语言处理领域。

我的第一个想法是:推荐使用NLTK(并在必要时学习Python),因为没有真正的PHP等价物(最近的库可能是NlpTools)。然而,事实证明,早期的NlpTools贡献者Dan Cardin创建了一个独立的库来处理您的问题:yooper/php-text-analysis

  

PHP Text Analysis是一个用于执行信息检索的库   使用PHP的(IR)和自然语言处理(NLP)任务   语言

将PHP文本分析添加到项目中

composer require yooper/php-text-analysis

以下是如何使用它的示例:

<?php

require_once('vendor/autoload.php');

$book = file_get_contents('pg74.txt'); // tom sawyer from the gutenberg project http://www.gutenberg.org/cache/epub/74/pg74.txt

// Create a tokenizer object to parse the book into a set of tokens
$tokenizer = new \TextAnalysis\Tokenizers\GeneralTokenizer();
$tokens = $tokenizer->tokenize($book);

$freqDist = new \TextAnalysis\Analysis\FreqDist($tokens);

//Get the top 10 most used words in Tom Sawyer 
$top10 = array_splice($freqDist->getKeyValuesByFrequency(), 0, 10);

freq_dist的调用会返回FreqDist个实例。

然后,您可以自己计算单词的权重(freq / numberOfAllTokens)或使用getKeyValuesByWeight()方法。

$top10[0]/$freqDist->getTotalTokens();
$weights = $freqDist->getKeyValuesByWeight();

...或者通过出现您最不频繁的首字词来标准化所选字词的频率,例如:

foreach ($top10 as $word => $freq) {
    $relWeight[$word] = $freq/end($top10);
}

根据您的输入,您会发现最常用的字词为athethat等。这就是您要删除stopwords的原因。我们才开始......

Here还有更多样本。