【问题标题】:sorting csv data according to occurrences of common words根据常用词的出现对 csv 数据进行排序
【发布时间】:2010-12-14 19:34:43
【问题描述】:

我有一个来自 csv 文件的大数据,如下所示。

url1, comment1
url2, comment2

我需要找到 cmets 之间的常用词,并根据每行常用词的出现情况对行进行相应的排序。

目前我能够获得常用词,但我不知道如何在不耗尽内存的情况下对每个常用词的行进行排序。

下面是我非常低效的代码。

$data = array();
while (($row = fgetcsv($fh, 1024, ',')) !== false) {
  $data[] = $row[1];
}

$str = preg_replace('/\s\s+/', ' ', trim(str_replace(array('!', '?', '.', ','), ' ', implode('', $data))));

$words = explode(" ", $str);
var_dump(array_count_values($words));

【问题讨论】:

  • 如果您要反复对 CSV 数据进行切片/切块,最好将其加载到数据库中,而不是在 PHP 中进行。一次性加载成本将被数据挖掘在数据库中后的容易程度所抵消。
  • 谢谢,我试试这个方法

标签: php csv


【解决方案1】:

将分解的数据/单词加载到数据库中听起来是个好主意,

或者你可以试试这个:

$summary = array();
$data = array();
while (($row = fgetcsv($fh, 1024, ',')) !== false) 
{
  $data[] = $row[1];
  $str    = preg_replace('/\s\s+/', ' ', trim(str_replace(array('!', '?', '.', ','), ' ', $row[1])));
  $words  = explode(" ", $str); 
  foreach ($words as $word)
  {
    $word = strtolower($word); // lowercase to reduce variations
    $summary[$word]++;
  }
}
/* variable $summary will contains all your count */
/* take note on the size of $summary, could growth quite big */

【讨论】:

  • 使用单独的$summary数组和调用array_count_values($words)有区别吗?
  • 您的方法是对整个 csv 进行比较(单个执行周期需要大量资源),而这种逐行比较分为多个执行周期,每个周期需要非常少的资源
猜你喜欢
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多