这似乎应该是一个显而易见的问题,但列表上的教程和文档不会出现。其中许多问题源于我的文本文件的大小(数百MB)以及我试图将它们归结为我的系统可管理的东西。结果,我正在分段工作,现在正试图将结果结合起来。
我有多个单词频率列表(约40个)。列表可以通过Import []获取,也可以作为Mathematica中生成的变量获取。每个列表显示如下,并使用Tally []和Sort []命令生成:
{{“the”,42216},{“of”,24903},{“和”,18624},{“n”,16850},{“in”,
16164},{“de”,14930},{“a”,14660},{“to”,14175},{“la”,7347}, {“was”,6030},{“l”,5981},{“le”,5735},<< 51293>>,{“abattoir”, 1},{“abattement”,1},{“abattagen”,1},{“abattage”,1}, {“abated”,1},{“abandonn”,1},{“abaiss”,1},{“aback”,1}, {“aase”,1},{“aaijaut”,1},{“aaaah”,1},{“aaa”,1}}
以下是第二个文件的示例:
{{“the”,30419},{“n”,20414},{“de”,19956},{“of”,16262},{“和”,
14488},{“to”,12726},{“a”,12635},{“in”,11141},{“la”,10739}, {“et”,9016},{“les”,8675},{“le”,7748},<<< 101032>>, {“abattement”,1},{“abattagen”,1},{“abattage”,1},{“abated”, 1},{“abandonn”,1},{“abaiss”,1},{“aback”,1},{“aase”,1}, {“aaijaut”,1},{“aaaah”,1},{“aaa”,1}}
我想将它们组合起来,以便频率数据聚合:即如果第二个文件有30,419次出现'the'并且连接到第一个文件,它应该返回有72,635次出现(等等我移动通过整个集合)。
答案 0 :(得分:10)
听起来你需要GatherBy
。
假设您的两个列表名为data1
和data2
,请使用
{#[[1, 1]], Total[#[[All, 2]]]} & /@ GatherBy[Join[data1, data2], First]
这很容易推广到任意数量的列表,而不仅仅是两个。
答案 1 :(得分:8)
尝试使用哈希表,就像这样。首先要做好准备:
ClearAll[freq];
freq[_] = 0;
现在,例如freq["safas"]
返回0.接下来,如果列表定义为
lst1 = {{"the", 42216}, {"of", 24903}, {"and", 18624}, {"n",
16850}, {"in", 16164}, {"de", 14930}, {"a", 14660}, {"to",
14175}, {"la", 7347}, {"was", 6030}, {"l", 5981}, {"le",
5735}, {"abattoir", 1}, {"abattement", 1}, {"abattagen",
1}, {"abattage", 1}, {"abated", 1}, {"abandonn", 1}, {"abaiss",
1}, {"aback", 1}, {"aase", 1}, {"aaijaut", 1}, {"aaaah",
1}, {"aaa", 1}};
lst2 = {{"the", 30419}, {"n", 20414}, {"de", 19956}, {"of",
16262}, {"and", 14488}, {"to", 12726}, {"a", 12635}, {"in",
11141}, {"la", 10739}, {"et", 9016}, {"les", 8675}, {"le",
7748}, {"abattement", 1}, {"abattagen", 1}, {"abattage",
1}, {"abated", 1}, {"abandonn", 1}, {"abaiss", 1}, {"aback",
1}, {"aase", 1}, {"aaijaut", 1}, {"aaaah", 1}, {"aaa", 1}};
你可以运行这个
Scan[(freq[#[[1]]] += #[[2]]) &, lst1]
之后,例如
freq["the"]
(*
42216
*)
然后是下一个列表
Scan[(freq[#[[1]]] += #[[2]]) &, lst2]
之后,例如
freq["the"]
72635
仍然
freq["safas"]
(*
0
*)
答案 2 :(得分:8)
以下是直接Sow
/ Reap
函数:
Reap[#2~Sow~# & @@@ data1~Join~data2;, _, {#, Tr@#2} &][[2]]
以下是acl方法的简明形式:
Module[{c},
c[_] = 0;
c[#] += #2 & @@@ data1~Join~data2;
{#[[1, 1]], #2} & @@@ Most@DownValues@c
]
这似乎比我系统上的Szabolcs代码快一点:
data1 ~Join~ data2 ~GatherBy~ First /.
{{{x_, a_}, {x_, b_}} :> {x, a + b}, {x : {_, _}} :> x}
答案 3 :(得分:6)
有一句古老的谚语,“如果你拥有的只是一把锤子,那么一切都变成了钉子。”所以,这是我的锤子:SelectEquivalents
。
使用SelectEquivalents
:
SelectEquivalents[data1~Join~data2, #[[1]]&, #[[2]]&, {#1, Total[#2]}&]
按顺序,第一个参数显然只是连接列表,第二个是它们被分组的(在这种情况下是第一个元素),第三个参数剥离字符串而只留下计数,第四个参数param将字符串作为#1
和列表中的#2
重新组合在一起。
答案 4 :(得分:3)
尝试ReplaceRepeated
。
加入列表。然后使用
//. {{f1___, {a_, c1_}, f2___, {a_, c2_}, f3___} -> {f1, f2, f3, {a, c1 + c2}}}