我有一段文字,长约1500字。我必须在本文中搜索某些单词的出现次数,并按类别对它们进行分组。例如,如果找到以下任何一个单词:“dalmation”,“boxer”,“terrier”,则回显“犬齿”,如果发现“狮子”,“豹子”,“cheeta”,则回显“猫科动物” “ 等等等等。在其他词中找到的词也是可以接受的,例如“foxterrier”。
我目前正在使用以下内容来浏览字符串:
$arrTitle = explode(" ", "Loren ipsum dolor ...............");
// For dogs:
foreach( $arrTitle as $key => $value){
echo "Name: $key, Value: $value <br />";
$words = array("dalmation", "boxer", "terrier");
foreach($words as $word){
if (stripos($value, $word) !== false) {
echo "Canines Exists";
}
}
}
//For cats:
foreach( $arrTitle as $key => $value){
echo "Name: $key, Value: $value <br />";
$words = array("lion", "leopard", "cheeta");
foreach($words as $word){
if (stripos($value, $word) !== false) {
echo "Felines Exists";
}
}
}
// ...Repeat the above for all categories.
处理需要很长时间,而且我不确定它是最有效的做事方式。请任何人帮我找到更快的方法吗?非常感谢你的帮助。
答案 0 :(得分:3)
你在我的地区!
到目前为止,最快的方法是array_flip
,然后使用isset
检查单词是否存在,花了我很长时间来计算出那个单词。这几乎可以保持数百万字(在字符串或数组中搜索永远不会与速度相匹配),但在这种情况下可能会占用RAM。
您应首先确定$words
。
$arrTitle = strtolower($arrTitle);
$arrTitle = explode(' ', $arrTitle);
$words=array('dalmation', 'boxer', 'terrier');
$words=array_flip($words);
foreach($arrTitle as $key => $value)
{
echo "Name: $key, Value: $value <br />";
if (isset($words[$value])) echo $value.' Exists <br/>';
}
答案 1 :(得分:2)
您可以编写类似单词的正则表达式,然后对每个单词进行单个搜索。 Regexps并不是非常快,但它们比在PHP中运行自己的循环更快。 : - )
$groups = array(
'Canines' => array("dalmation", "boxer", "terrier"),
'Felines' => array("lion", "leopard", "cheeta")
);
foreach ($groups as $group => $members) {
$pattern = "/" . implode("|", $members) . "/i";
if (preg_match($pattern, $src)) {
print $group;
}
}
元代码。我没有测试过这个。
这里的想法是从代码中删除实际的组。毕竟,您的数据可以从数据库或其他来源加载;数据结构和数据应该是分开的。
通过使用上面的数组,您可以添加新组而无需更改比较代码的内容。即“鱼”成为一个群体,而不是一大堆代码。
答案 2 :(得分:1)
作为当前脚本的优化,您应该检查同一循环中的所有单词,而不是多次在$ arrTitle上运行foreach。或者作为替代方案,只需在每个单词的整个文档上使用stripos。
如果这是针对实际的生产站点并且需要反复运行,我根本不会在PHP中执行此操作。对文档具有适当索引的数据库(MySQL或Solr)可以产生更快的结果。