- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两张 table 。在表 1 中,我有大约 400K 行,每行包含一段文本,最多可以包含 50 个句子。在表 2 中,我有一个包含 80k 个单词的词典以及我需要对每个段落的每个单词进行编码的分数。
我的 PHP 脚本的全部要点是根据需要将每一段文本分解成尽可能多的单词,然后在词典中查找每个单词的得分是多少,最后计算所有单词的总分每行。
到目前为止,我的策略是创建一个执行以下操作的脚本:
我的代码有效但效率不高。问题是脚本太慢了,让它运行一个小时只会计算前 500 行。这是个问题,因为我有 40 万行。我将需要此脚本用于其他项目。
你会建议我做什么来降低这个过程的强度?
<?php
//Include functions
include "functions.php";
ini_set('max_execution_time', 9000000);
echo 'Time Limit = ' . ini_get('max_execution_time');
$db='senate';
//Function to search into the array lexicon
function searchForId($id, $array) {
foreach ($array as $key2 => $val) {
if ($val['word'] === $id) {
return $key2;
}
}
return null;
}
// tags to remove
$remove = array('{J}','{/J}','{N}','{/N}','{V}','{/V}','{RB}','{/RB}');
$x=1;
//Conecting the database
if (!$conn) {
die('Not connected : ' . mysql_error());}
// Choose the current db
mysql_select_db($db);
//Slurps the lexicon into an array
$sql = "SELECT word, score FROM concreteness";
$resultconcreteness = mysql_query($sql) or die(mysql_error());
$array = array();
while($row = mysql_fetch_assoc($resultconcreteness)) {
$array[] = $row;
}
//loop
while($x<=500000) {
$data = mysql_query("SELECT `key`, `tagged` FROM speechesLCMcoded WHERE `key`='$x'") or die(mysql_error());
// puts the "data" info into the $info array
$info = mysql_fetch_array( $data);
$tagged=$info['tagged'];
unset($weight);
unset($count);
$weight=0;
$count=0;
// Print out the contents of the entry
Print "<b>Key:</b> ".$info['key'] . " <br>";
// Explodes the sentence
$speech = explode(" ", $tagged);
// Loop every word
foreach($speech as $word) {
//Check if string contains our tag
if(!preg_match('/({V}|{J}|{N}|{RB})/', $word, $matches)) {} else{
//Removes our tags
$word = str_replace($remove, "", $word);
$id = searchForId($word, $array);
// print "ID: " . $id . "<br>";
// print "Word: " . $array[$id]['word'] . "<br>";
// print "Score: " . $array[$id]['score'] . "<br>";
$weight=$weight+$array[$id]['score'];
$count=$count +1;
// print "Weight: " . $weight . "<br>";
// print "Count: " . $count . "<br>";
}
}
$sql = "UPDATE speechesLCMcoded SET weight='$weight', count='$count' WHERE `key`='$x';" ;
$retval = mysql_query( $sql, $conn );
if(! $retval )
{die('Could not update data: ' . mysql_error());}
echo "Updated data successfully\n";
ob_flush();
flush();
//Increase the loop by one
$x=$x+1;
}?>
这是索引:
CREATE TABLE `speechesLCMcoded` (
`key` int(11) NOT NULL AUTO_INCREMENT,
`speaker_state` varchar(100) NOT NULL,
`speaker_first` varchar(100) NOT NULL,
`congress` varchar(100) NOT NULL,
`title` varchar(100) NOT NULL,
`origin_url` varchar(100) NOT NULL,
`number` varchar(100) NOT NULL,
`order` varchar(100) NOT NULL,
`volume` varchar(100) NOT NULL,
`chamber` varchar(100) NOT NULL,
`session` varchar(100) NOT NULL,
`id` varchar(100) NOT NULL,
`raw` mediumtext NOT NULL,
`capitolwords_url` varchar(100) NOT NULL,
`speaker_party` varchar(100) NOT NULL,
`date` varchar(100) NOT NULL,
`bills` varchar(100) NOT NULL,
`bioguide_id` varchar(100) NOT NULL,
`pages` varchar(100) NOT NULL,
`speaker_last` varchar(100) NOT NULL,
`speaker_raw` varchar(100) NOT NULL,
`tagged` mediumtext NOT NULL,
`adjectives` varchar(10) NOT NULL,
`verbs` varchar(10) NOT NULL,
`nouns` varchar(10) NOT NULL,
`weight` varchar(50) NOT NULL,
`count` varchar(50) NOT NULL,
PRIMARY KEY (`key`)
) ENGINE=InnoDB AUTO_INCREMENT=408344 DEFAULT CHARSET=latin1
最佳答案
您有一个相当小的引用表(您的词典)和一个巨大的文本语料库(表 1)。
如果我是你,我会通过从表中读取整个词典到内存中的 php 数组来启动你的程序。即使您所有的单词都是 20 个字符的长度,这也只需要十几兆字节的 RAM。
然后通过在内存中查找单词而不是使用 SQL 查询来执行第 4 步。您的内部循环(针对每个单词)会更快,并且同样准确。
不过,请注意一件事。如果要复制 MySQL 的不区分大小写的查找行为,则需要通过将它们转换为小写来规范化词典中的单词。
看到你的代码后编辑
一些专业提示:
$value = $array[$key]
。这很快。您不必线性搜索数组。您正在每个单词一次!!mysql_
函数调用集被其开发人员和其他所有人弃用和鄙视,这是有充分理由的。你的循环中发生了太多事情。
你需要的是:
首先,从使用mysql_
接口(interface)切换到使用mysqli_
。去做就对了。 mysql_
太慢、太旧、太笨拙。
$db = new mysqli("host", "user", "password", "database");
其次,改变加载词典的方式,以优化整个关联数组处理。
$lookup = array();
//Slurps the lexicon into an array, streaming it row by row
$sql = "SELECT word, score FROM concreteness";
$db->real_query($sql) || die $db->error;
$lkup = $db->use_result();
while ($row = $lkup->fetch_row()) {
$lookup[strtolower($row[0])] = $row[1];
}
$lkup->close();
这为您提供了一个名为 $lookup
的关联数组。如果你有一个$word
,你可以通过这种方式找到它的权重值。这很快。您的示例代码中的内容非常慢。请注意,在创建键和查找单词时,键都被转换为小写。出于性能原因,如果可以避免,请不要将它放在函数中。
if (array_key_exists( strtolower($word), $lookup )) {
$weight += $lookup[strtolower($word)]; /* accumulate weight */
$count ++; /* increment count */
}
else {
/* the word was not found in your lexicon. handle as needed */
}
最后,您需要优化对文本语料库行的查询及其更新。我相信您应该使用准备好的语句来做到这一点。
这是如何进行的。
在程序的开头附近放置此代码。
$previouskey = -1;
if (/* you aren't starting at the beginning */) {
$previouskey = /* the last successfully processed row */
}
$get_stmt = $db->prepare('SELECT `key`, `tagged`
FROM speechesLCMcoded
WHERE `key` > ?
ORDER BY `key` LIMIT 1' );
$post_stmt = $db->prepare ('UPDATE speechesLCMcoded
SET weight=?,
count=?
WHERE `key`=?' );
这些为您提供了两个随时可用的处理语句。
请注意,$get_stmt
检索您尚未处理的第一个 key
。即使您丢失了一些 key ,这也会起作用。总是好的。这将非常有效,因为您在 key
列上有一个索引。
所以这就是你的循环最终的样子:
$weight = 0;
$count = 0;
$key = 0;
$tagged = '';
/* bind parameters and results to the get statement */
$get_stmt->bind_result($key, $tagged);
$get_stmt->bind_param('i', $previouskey);
/* bind parameters to the post statement */
$post_stmt->bind_param('iii',$weight, $count, $key);
$done = false;
while ( !$done ) {
$get_stmt->execute();
if ($get_stmt->fetch()) {
/* do everything word - by - word here on the $tagged string */
/* do the post statement to store the results */
$post_stmt->execute();
/* update the previous key prior to next iteration */
$previouskey = $key;
$get_stmt->reset();
$post_stmt->reset();
} /* end if fetch */
else {
/* no result returned! we are done! */
$done = true;
}
} /* end while not done */
这应该可以让您将每行的处理速度降到亚秒级。
关于php - 文本语料库中的单词匹配非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23555694/
表架构 DROP TABLE bla; CREATE TABLE bla (id INTEGER, city INTEGER, year_ INTEGER, month_ INTEGER, val I
我需要拆分字符串/或从具有以下结构的字符串中获取更容易的子字符串。 字符串将来自 window.location.pathname 或 window.location.href,看起来像 text/n
每当将对象添加到数组中时,我都会尝试更新 TextView ,并在 TextView 中显示该文本,如下所示: "object 1" "object 2" 问题是,每次将新对象添加到数组时,它都会覆盖
我目前正在寻找使用 Java 读取网站可见文本并将其存储为纯文本字符串的方法。 换句话说,我想转换成这样: Hello stupid World进入“ Hello World ” 或者类似的东西 Un
我正在尝试以文本和 HTML 格式发送电子邮件,但无法正确发送正确的 header 。特别是,我想设置 Content-Type header ,但我找不到如何为 html 和文本部分单独设置它。 这
我尝试了上面的代码,但我无法绑定(bind)文本,我怎样才能将资源内部文本 bloc
我刚刚完成了 Space Shooter 教程,由于没有 GUIText 对象,所以我创建了 UI.Text 对象并进行了相应的编码。它在统一播放器中有效,但在构建 Web 应用程序后无效。我花了一段
我有这个代码: - (IBAction)setButtonPressed:(id)sender { NSUserDefaults *sharedDefaults = [[NSUserDefau
抱歉标题含糊不清,但我想不出我想在标题中做什么。无论如何,对于图像上的文本,我使用了 JLabel 文本并将其添加到图标中。 JLabel icon = new JLabel(new Imag
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我在将 Twitter 嵌入到我从 HTML 5 转换的 wordpress 运行网站时遇到问题。 我遇到的问题是推文不是我的自定义字体... 这是我无法使用任何 css 定位的 HTML 代码,我正
我正在尝试找到解决由于使用以下形式的代码而导致的冗余字符串连接问题的最佳方法: logger.debug("Entering loop, arg is: " + arg) // @1 在大多数情况下,
我写了这个测试 @Test public void removeRequestTextFromRouteError() throws Exception { String input = "F
我目前正在创建一个正则表达式来拆分所有匹配以下格式的字符串:&[文本],并且需要获取文本。字符串可能类似于:something &[text] &[text] everything &[text] 等
有没有办法将标题文本从一个词变形为另一个词,同时保留两个词中使用的字母?我看过的许多 css 文本动画大多是视觉的,很少有旋转整个单词的。 我想要做的是从一个词过渡,例如“BEACH”到“CHANGE
总结matplotlib绘图如何设置坐标轴刻度大小和刻度。 上代码: ?
我在容器 (1) 中创建了容器 (2)。你能帮忙如何向容器(1)添加文本吗?下面是我的代码 return Scaffold( body: Padding( padding: c
我似乎找不到任何人或任何人这样做过。我试图限制我们使用的图像数量,并想创建一个带有渐变作为其“颜色”的文本,并在其周围设置渐变轮廓/描边 到目前为止,我还没有看到任何将两者结合在一起的东西。 我可以自
我正在为视频游戏暗黑破坏神 2 使用 discord.py 构建一个不和谐机器人。其中一项功能要求机器人从暗黑破坏神 2 屏幕截图中提取项目的名称和属性。我目前正在为此使用 pytesseract,但
我很难弄清楚如何旋转 strip.text theme 中的属性来自 ggplot2 .我使用的是 R 版本 3.4.2 和 ggplot2 版本 2.2.1。 以下是 MWE 的数据。 > dput
我是一名优秀的程序员,十分优秀!