J'ai besoin de pouvoir rechercher du texte dans un grand nombre de fichiers (.txt) zippé. La compression peut être changée à autre chose ou même devenue exclusive. Je veux éviter de déballier tous les fichiers et de compresser (encoder) la chaîne de recherche et la recherche dans des fichiers compressés. Cela devrait être possible en utilisant la compression Huffman avec le même code de code pour tous les fichiers. Je ne veux pas réinventer la roue, alors ... Tout le monde connaît une bibliothèque qui fait quelque chose comme ça ou un algorithme de Huffman qui est mis en œuvre et testé, ou peut-être une meilleure idée? P>
Merci d'avance p>
5 Réponses :
Je peux être complètement faux ici, mais je ne pense pas qu'il y aurait un moyen fiable de rechercher une chaîne donnée sans décoder les fichiers. Ma compréhension des algorithmes de compressions est que le flux de bits correspondant à une chaîne donnée dépend de ce qui se passe avant la chaîne dans le fichier non compressé. Vous pourrez peut-être trouver un codage donné pour une chaîne particulière dans un fichier donné, mais je suis sûr que cela ne serait pas cohérent entre les fichiers. P>
Il est peu probable que vous puissiez rechercher des chaînes non compressées dans un fichier compressé. Je suppose que l'un pour vos meilleures options consiste à indexer les fichiers en quelque sorte. En utilisant Lucene peut-être? P>
La plupart des fichiers texte sont compressés avec l'un des LZ-Family d'algorithmes, qui combinent un codeurdicatère avec un codeur d'entropie comme Huffman. P>
Parce que le codeur de dictionnaire s'appuie sur un "dictionnaire" continuellement mis à jour, son résultat de codage dépend de l'historique (tous les codes du dictionnaire qui est dérivé des données d'entrée jusqu'au symbole actuel), il n'est donc pas possible. Pour passer à un certain endroit et commencer à décoder, sans d'abord décoder toutes les données précédentes. P>
À mon avis, vous pouvez simplement utiliser un décodeur de flux ZLIB qui renvoie des données décompressées car elle va sans attendre que l'ensemble du fichier soit décompressé. Cela ne sauvera pas l'heure d'exécution mais sauvera la mémoire. P>
Une seconde suggestion est de faire coder Huffman sur des mots anglais et d'oublier la partie du donneur de dictionnaire. Chaque mot anglais est mappé sur un code de préfixe unique. P>
Enfin, @shodan a donné la suggestion la plus judicieuse, qui consiste à indexer les fichiers, à compresser l'index et à l'ensemble avec les fichiers texte compressés. Pour effectuer une recherche, décompresser uniquement le fichier d'index et rechercher les mots. C'est en fait une amélioration par rapport à la codage de Huffman sur des mots - une fois que vous avez trouvé la fréquence des mots (afin d'attribuer le code de préfixe de manière optimale), vous avez déjà construit l'index, vous pouvez donc conserver l'index de la recherche. p>
La recherche de texte dans les fichiers compressé peut être plus rapide que la recherche de la même chose dans des fichiers texte non compressés. P>
Une technique de compression que j'ai vue qui sacrifie un peu d'espace afin de faire des recherches rapides: p>
En particulier, la recherche d'un mot unique réduit généralement la comparaison de l'indice 16 bits dans le texte compressé, ce qui est plus rapide que la recherche de ce mot dans le texte d'origine, car P>
Certaines types d'expressions régulières peuvent être traduites dans une autre expression régulière qui trouve directement des éléments dans le fichier compressé (et trouve également quelques faux positifs). Une telle recherche fait également moins de comparaisons que d'utiliser l'expression régulière d'origine sur le fichier texte d'origine, car le fichier compressé est plus court, mais généralement chaque comparaison d'expression régulière nécessite plus de travail, de sorte qu'il peut ou ne pas être plus rapide que le regex d'origine fonctionnant sur le texte original. p>
(en principe, vous pouvez remplacer les codes 16 bits de longueur fixe avec des codes de préfixes de Huffman de longueur variable, car Rwong mentionné - le fichier compressé résultant serait plus petit, mais le logiciel de gérer ces fichiers serait un peu plus lent et plus compliqué). P>
Pour des techniques plus sophistiquées, vous pourriez regarder p>
Ceci est possible et peut être fait de manière assez efficace. Il y a beaucoup de recherches passionnantes sur ce sujet, plus formellement appelée structure de données succinct. Certains sujets que je recommanderais de rechercher: arborescence d'ondelettes, index FM / RRR, suffixe succincte. Vous pouvez également rechercher efficacement les chaînes codées Huffman, car un certain nombre de publications ont démontré. P>
Six ans après avoir demandé, ce reste i> est un sujet de recherche i>. C'est "évident" Comment rechercher dans le texte comprimé par le caractère / jeton dans fixe i> dictionnaire. (Statique Huffman code dans des bits intégrés: Encodé, prendre huit motifs d'octets "(bit) octets" Décalage d'un bit, utilisez une recherche régulière et une vague de main sur le reste.)
La recherche arbitraire de la recherche de texte appropriée compressée a été affichée en 2007. Voir Sadakane (2007) "Structures de données succinctes pour systèmes de récupération de texte flexibles", SCIENDIRECT.COM / SCIENCE/Article/PII/s1570866706000141
Related: Stackoverflow.com/Questtions/4855403/...