我试图在本地阅读HTML文档中的所有单词。我有一个循环,它为我做。我创建了一个包含不需要的字符的数组。我不希望那些特殊的不需要的字符出现在我的单词数组中。我尝试了以下代码但没有改变。
$rii = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('fulltext/course'));
$fulltext_course_files = array();
$unwantedChars = array('', ' ', '"', '!', '\'', '+', '%', '&', '/', '(', ')', '=',
'*', '.', ',', '?', '-', '_', ':', ';', '\\');
foreach ($rii as $f) {
if ($f->isDir()) {
continue;
} else {
$st = strip_tags(strtolower(file_get_contents($f)));
$swc = deleteStopWords(str_word_count($st, 1));
if (!in_array($st, $unwantedChars)) {
$fulltext_course_files[$f->getFilename()] = array_count_values($swc);
}
}
}
当我var_dump($arr);
array (size=230)
'4.html' =>
array (size=50)
'-' => int 7 ??
'cs' => int 1
'page' => int 1
'systems' => int 2
'programming' => int 1
'' => int 12 ??
'operating' => int 2
...
如何删除??
指向的元素,我该怎么办?
修改1
更好的解决方案是防止不需要的字符进入数组,正如@David建议的那样。我试图从
更改if条件if (!in_array($st, $unwantedChars))
到
if (!in_array($f->getFilename(), $unwantedChars))
没有改变。还有不需要的密钥。
修改2
我也尝试了以下内容:
foreach ($fulltext_course_files as $key => $val) {
if (in_array($key, $unwantedChars)) {
unset($fulltext_course_files[$key] );
}
}
再一次,没有帮助!
答案 0 :(得分:3)
您可以使用未设置:http://php.net/manual/en/function.unset.php
unset($array['mykey']);
答案 1 :(得分:0)
不确定$f->getFilename()
的作用,但是根据你的角色测试它会不容易吗?
if(!in_array($f->getFilename(), $unwantedChars) {
$fulltext_course_files[$f->getFilename()] = array_count_values($swc);
}
答案 2 :(得分:0)
不是使用in_array
来搜索不需要的字符,而是可以将它们全部存储在字符串中,并在其上使用strchr
:它基本上等同于您编写的内容,但是用于存储而不是数组的字符串,应该更快。那说......
我的猜测是,最终数组中仍然存在的不需要的字符实际上是与正常标点字符图形相似的字符,但具有不同的代码点(对应于该字符的整数值)。可能是您的文档使用了具有多个不同破折号和双引号字符的编码,例如 utf-8 ?如果是这种情况,那么您将很难过滤掉所有噪音,以便只保留字母字符。但是,如果你使用白色列表方案(即检查好字符而不是坏字符),也许你只能保留那些你感兴趣的字符。幸运的是,有一些功能可以帮助你你这样做:ctype_alpha
仅用于字母,ctype_alnum
用于字母数字。它们所属的 Ctype 扩展名通常在大多数php安装中启用。
这是一个快速实施:
function get_word_count($content){
$words = array();
$b = 0;
$len = strlen($content);
for ($i = 0; $i < $len; $i++){
$c = $content[$i];
if (!ctype_alnum($c)){
if ($b < $i){
$w = strtolower(substr($content, $b, $i - $b));
if (isset($words[$w]))
$words[$w]++;
else $words[$w] = 1;
}
$b = $i + 1;
}
}
return $words;
}
请注意:
因为它只接受字母数字字符,所以你将无法索引非英语单词。
即使在这种情况下,也有一些复合词你可能想要考虑为一个,例如你或逐步。这个功能对你没有帮助。如果您需要更强大的方法,我建议您查看PHP的现有自然语言处理工具包(您选择的搜索引擎将报告多个项目)。