词袋模型和文档术语矩阵是同一回事吗?
我有一个由许多文件组成的训练数据集。我想将它们全部读取到一个数据结构(哈希映射?)中,以创建特定类别的文档的词袋模型,这些类别可以是科学、宗教、体育或性,作为感知器实现的准备工作。
目前我有最简单的Java I/O结构,即:
String text; BufferedReader br = new BufferedReader(new FileReader("file")); while ((text = br.readLine()) != null) { //读取多个文件 //生成一个哈希映射,每个唯一词作为键, //该词出现的频率作为值 }
所以我想做的是从目录中的多个文件读取输入,并将所有数据保存到一个底层结构中,该如何做呢?我应该将它写到某个文件中吗?
我认为如我在代码注释中描述的哈希映射应该可以工作,基于我对词袋模型的理解。这是正确的吗?我如何实现这样一个东西以与从多个文件读取输入同步?我应该如何存储它,以便以后将其纳入我的感知器算法中?
我见过这样做:
String names = new String[]{"a.txt", "b.txt", "c.txt"}; StringBuffer strContent = new StringBuffer(""); for (String name : names) { File file = new File(name); int ch; FileInputStream stream = null; try { stream = new FileInputStream(file); while( (ch = stream.read()) != -1) { strContent.append((char) ch); } } finally { stream.close(); } }
但这是一个蹩脚的解决方案,因为你需要提前指定所有文件,我认为这应该更动态。如果可能的话。
回答:
你可以尝试下面的程序,它是动态的,你只需要提供你的目录路径。
public class BagOfWords {ConcurrentHashMap<String, Set<String>> map = new ConcurrentHashMap<String, Set<String>>();public static void main(String[] args) throws IOException { File file = new File("F:/Downloads/Build/"); new BagOfWords().iterateDirectory(file);}private void iterateDirectory(File file) throws IOException { for (File f : file.listFiles()) { if (f.isDirectory()) { iterateDirectory(file); } else { // 读取文件 // 分割并放入集合中 // 添加到映射中 } }}
}