结合Word频率数据列表

时间:2011-10-24 13:00:24

标签: wolfram-mathematica word-frequency

这似乎应该是一个显而易见的问题,但列表上的教程和文档不会出现。其中许多问题源于我的文本文件的大小(数百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次出现(等等我移动通过整个集合)。

5 个答案:

答案 0 :(得分:10)

听起来你需要GatherBy

假设您的两个列表名为data1data2,请使用

{#[[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}}}