我正在编写一份应用程序来帮助改进论文的机器翻译。为此,我需要大量的ngram数据。我从谷歌获得了数据,但它的格式不是很有用。
以下是Google的数据格式:
ngram TAB year TAB match_count TAB page_count TAB volume_count NEWLINE
这是我之后的事情:
ngram total_match_count_for_all_years
因此,我编写了一个小应用程序来运行这些文件并提取ngrams并在多年内汇总数据以获得总计数。它似乎运行良好。但是,由于Google文件太大(每个1.5GB!其中99个>。<。)它需要很长时间才能完成所有这些。
以下是代码:
public class mergeData
{
private static List<String> storedNgrams = new ArrayList<String>(100001);
private static List<String> storedParts = new ArrayList<String>(100001);
private static List<String> toWritePairs = new ArrayList<String>(100001);
private static int rows = 0;
private static int totalFreq = 0;
public static void main(String[] args) throws Exception
{
File bigram = new File("data01");
BufferedReader in = new BufferedReader(new FileReader(bigram));
File myFile = new File("newData.txt");
Writer out = new BufferedWriter(new FileWriter(myFile));
while (true)
{
rows = 0;
merge(in, out);
}
}
public static void merge(BufferedReader in, Writer out) throws IOException
{
while (rows != 1000000)
{
storedNgrams.add(in.readLine());
rows++;
}
while (!(storedNgrams.isEmpty()))
{
storedParts.addAll(new ArrayList<String>(Arrays.asList(storedNgrams.get(0).split("\\s"))));
storedNgrams.remove(0);
}
while (storedParts.size() >= 8)
{
System.out.println(storedParts.get(0) + " " + storedParts.get(1) + " " + storedParts.get(6)
+ " " + storedParts.get(7));
if (toWritePairs.size() == 0 && storedParts.get(0).equals(storedParts.get(6))
&& storedParts.get(1).equals(storedParts.get(7)))
{
totalFreq = Integer.parseInt(storedParts.get(3)) + Integer.parseInt(storedParts.get(9));
toWritePairs.add(storedParts.get(0));
toWritePairs.add(storedParts.get(1));
toWritePairs.add(Integer.toString(totalFreq));
storedParts.subList(0, 11).clear();
}
else if (!(toWritePairs.isEmpty()) && storedParts.get(0).equals(toWritePairs.get(0))
&& storedParts.get(1).equals(toWritePairs.get(1)))
{
int totalFreq = Integer.parseInt(storedParts.get(3))
+ Integer.parseInt(toWritePairs.get(2));
toWritePairs.remove(2);
toWritePairs.add(Integer.toString(totalFreq));
storedParts.subList(0, 5).clear();
}
else if ((!toWritePairs.isEmpty())
&& !(storedParts.get(0).equals(storedParts.get(6)) && storedParts.get(1).equals(
storedParts.get(7))))
{
toWritePairs.add(storedParts.get(0));
toWritePairs.add(storedParts.get(1));
toWritePairs.add(storedParts.get(2));
storedParts.subList(0, 2).clear();
}
else if (!(toWritePairs.isEmpty()))
{
out.append(toWritePairs.get(0) + " " + toWritePairs.get(1) + " " + toWritePairs.get(2)
+ "\n");
toWritePairs.subList(0, 2).clear();
}
out.flush();
}
}
}
如果有人有任何想法如何提高这些文件的处理速度,那将对我有很大的帮助。
答案 0 :(得分:2)
在数据库中创建临时表。使用文件中的行填充它。必要时创建索引,让数据库进行分组。它将简化程序的逻辑,并且最有可能执行得更快。
答案 1 :(得分:1)
我建议您随时处理数据,而不是读取大量数据并在以后处理。从您的程序中不清楚您尝试提取/聚合的信息。
即使在快速机器上,我预计每个文件大约需要20秒。