我试图从CSV文件中获取随机产品描述的情绪得分,我面临着一个问题,我认为是API响应时间,我不确定我是否使用API不正确/低效地遍历CSV,但要获得所有300多个CSV的结果需要很长时间CSV中的条目,每当我想将新的更改推送到我的代码库时,我都需要等待API每次重新评估条目,下面是我为加载CSV文件和获取情绪评分而编写的代码
<?php
set_time_limit(500); // extended timeout due to slow / overwhelmed API response
function extract_file($csv) { // CSV to array function
$file = fopen($csv, 'r');
while (!feof($file)) {
$lines[] = fgetcsv($file, 1000, ',');
}
fclose($file);
return $lines;
}
$the_file = 'dataset.csv';
$csv_data = extract_file($the_file);
$response_array = []; // array container to hold returned sentiment values from among prduct descriptions
for($x = 1; $x < count($csv_data) - 1; $x++) { // loop through all descriptions
echo $x; // show iteration
$api_text = $csv_data[$x][1];
$api_text = str_replace('&', ' and ', $api_text); // removing escape sequence characters, '&' breaks the api :)
$api_text = str_replace(" ", "%20", $api_text); // serializing string
$text = 'text=';
$text .=$api_text; // serializing string further for the API
//echo 'current text1: ', $api_text;
$curl = curl_init(); // API request init
curl_setopt_array($curl, [
CURLOPT_URL => "https://text-sentiment.p.rapidapi.com/analyze",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => $text,
CURLOPT_HTTPHEADER => [
"X-RapidAPI-Host: text-sentiment.p.rapidapi.com",
"X-RapidAPI-Key: <snip>",
"content-type: application/x-www-form-urlencoded"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
$json = json_decode($response, true); // convert response to JSON format
if(isset($json["pos"]) == false) { // catching response error 100, makes array faulty otherwise
continue;
}
else {
array_push($response_array, array($x, "+" => $json["pos"], "-" => $json["neg"])); // appends array with sentiment values at current index
}
}
echo "<br>";
echo "<br> results: ";
echo "<p>";
for ($y = 0; $y < count($response_array); $y++){ // prints out all the sentiment values
echo "<br>";
echo print_r($response_array[$y]);
echo "<br>";
}
echo "</p>";
echo "<br>the most negative description: ";
$max_neg = array_keys($response_array, max(array_column($response_array, '-')));
//$max_neg = max(array_column($response_array, '-'));
echo print_r($csv_data[$max_neg[0]]);
echo "<br>the most positive description: ";
$max_pos = array_keys($response_array, max(array_column($response_array, '+')));
echo print_r($csv_data[$max_pos[0]]);
?>
这段代码片段的目的是在csv的描述列中找到最消极和最积极的情绪,并根据它们的索引将它们打印出来,我只对找到积极和消极情绪字数最多的描述感兴趣,而不是总体情绪的百分比
该文件可以在此git repo中找到
谢谢你的建议
2条答案
按热度按时间8fq7wneg1#
这可以通过创建缓存文件来实现。
此解决方案使用产品名称作为每个条目的键,创建一个包含API结果的文件
cache.json
。在后续调用中,它将使用该高速缓存值(如果存在)。
结果:
wxclj1h52#
"你需要知道时间的流逝"
首先确定curl请求中的时间位置。
我猜是API响应时间。
如果是这样的话,我有一个解决方案。同时,我将得到“多任务”代码代码,我用它来做同时curl请求。
curl具有您需要的定时。它看起来像这样:
只需添加几行代码
同时运行curl套接字。
把你的卷发放到curl.php里
这段代码进入CSV循环,创建所有URL查询字段并传递给curl.php(例如
http://127.0.0.1/curl.php?text=$text
)然后处理所有URL。
然后监视套接字并检索每个套接字的响应。
然后关闭插座,直到您拥有所有这些。
所有结果都以
$results[]
为单位。