基于词频减少文本的算法

问题描述 投票:1回答:2

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

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

house house house house book book book

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

house house book

所以这种方式最常用的词仍然是2和1书。

php regex string text logic
2个回答
1
投票

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

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

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

将PHP Text Analysis添加到项目中

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是一些更多的样本。


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

未压缩的文本:房子的房子房子书书

© www.soinside.com 2019 - 2024. All rights reserved.