Я разрабатываю поисковую систему с векторной моделью пространства. Я успешно вычислил tf-idf с данными ассоциативного массива, которые уже определены в коде. Теперь я хочу, чтобы данные были получены из каталога, в котором у меня есть папки, и в каждой папке есть несколько текстовых файлов с фиктивными данными. Я пробовал много, но застрял в 1 точке, используя функцию glob, потому что я хочу, чтобы все .txt- файлы были как ключ, а его содержимое как значение в цикле foreach функции glob... Ниже мой код.
Tf-idf с ассоциативными данными массива
$collection = array(
1 => 'this string is a short string but a good string',
2 => 'this one isn\'t quite like the rest but is here',
3 => 'this is a different short string that\' not as short'
);
$dictionary = array();
$docCount = array();
foreach($collection as $docID => $doc) {
$terms = explode(' ', $doc);
$docCount[$docID] = count($terms);
foreach($terms as $term) {
if(!isset($dictionary[$term])) {
$dictionary[$term] = array('df' => 0, 'postings' => array());
}
if(!isset($dictionary[$term]['postings'][$docID])) {
$dictionary[$term]['df']++;
$dictionary[$term]['postings'][$docID] = array('tf' => 0);
}
$dictionary[$term]['postings'][$docID]['tf']++;
}
}
$temp = ('docCount' => $docCount, 'dictionary' => $dictionary);
Как вы видите в первом цикле foreach, это $ DocID является ключевым, а $ doc - его содержимым (значением) массива коллекции. Но я не знаю, как реализовать то же самое, когда файлы читаются из каталога. См. Код ниже..
Tf-idf С.txt Файлы и его содержимое читаются из каталога
foreach (glob("C:\\wamp\\www\\Web-info\\documents\\awd_1990_00\\*.txt") as $file) {
$file_handle = fopen($file, "r");
//echo $file;
$dictionary = array();
$docCount = array();
foreach($file as $docID=> $value) {
echo $value;
$terms = explode(' ', $doc);
$docCount[$docID] = count($terms);
foreach($terms as $term) {
if(!isset($dictionary[$term])) {
$dictionary[$term] = array('df' => 0, 'postings' => array());
}
if(!isset($dictionary[$term]['postings'][$docID])) {
$dictionary[$term]['df']++;
$dictionary[$term]['postings'][$docID] = array('tf' => 0);
}
$dictionary[$term]['postings'][$docID]['tf']++;
}
}
}
$temp = array('docCount' => $docCount, 'dictionary' => $dictionary);
Это дает мне ошибку в 1-м цикле foreach, который недействителен для сжатия в цикле foreach. Как я уже упоминал ранее, я хочу, чтобы файлы.txt были ключом и его содержимое в качестве значения в первом цикле foreach. Но я получил эту ошибку. Кто-нибудь может рассказать мне, как это сделать.. Спасибо заранее.
Если вы хотите обрабатывать весь файл как одно значение, вы можете использовать file_get_contents()
для чтения файла в строку:
$dictionary = array();
$docCount = array();
foreach (glob("C:\\wamp\\www\\Web-info\\documents\\awd_1990_00\\*.txt") as $docID) {
$value = file_get_contents($docID);
...
}
$file
- это просто имя файла, что вы зацикливаете наforeach
? Если вы хотитеwhile ($line = fgets($file_handle)
строки, используйтеwhile ($line = fgets($file_handle)
.