结合Word频率数据列表

pro*_*ian 11 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},{"and",
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次出现''并且加入第一个文件,它应该返回有72,635次出现(依此类推,因为我在整个文件中移动)采集).

Sza*_*lcs 10

这听起来像你需要的GatherBy.

假设你的两个列表被命名为data1data2,然后用

{#[[1, 1]], Total[#[[All, 2]]]} & /@ GatherBy[Join[data1, data2], First]
Run Code Online (Sandbox Code Playgroud)

这很容易推广到任意数量的列表,而不仅仅是两个.


acl*_*acl 8

尝试使用哈希表,像这样.首先要做的事情:

ClearAll[freq];
freq[_] = 0;
Run Code Online (Sandbox Code Playgroud)

现在例如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}};
Run Code Online (Sandbox Code Playgroud)

你可以运行这个

Scan[(freq[#[[1]]] += #[[2]]) &, lst1]
Run Code Online (Sandbox Code Playgroud)

之后,例如

freq["the"]
(*
42216
*)
Run Code Online (Sandbox Code Playgroud)

然后是下一个清单

Scan[(freq[#[[1]]] += #[[2]]) &, lst2]
Run Code Online (Sandbox Code Playgroud)

之后,例如

freq["the"]
72635
Run Code Online (Sandbox Code Playgroud)

同时还

freq["safas"]
(*
0
*)
Run Code Online (Sandbox Code Playgroud)


Mr.*_*ard 8

这是直接Sow/ Reap功能:

Reap[#2~Sow~# & @@@ data1~Join~data2;, _, {#, Tr@#2} &][[2]]
Run Code Online (Sandbox Code Playgroud)

这是acl方法的简明形式:

Module[{c},
  c[_] = 0;

  c[#] += #2 & @@@ data1~Join~data2;

  {#[[1, 1]], #2} & @@@ Most@DownValues@c
]
Run Code Online (Sandbox Code Playgroud)

这看起来比我系统上的Szabolcs代码快一点:

data1 ~Join~ data2 ~GatherBy~ First /.
  {{{x_, a_}, {x_, b_}} :> {x, a + b}, {x : {_, _}} :> x}
Run Code Online (Sandbox Code Playgroud)


rco*_*yer 6

有一句古老的谚语说,"如果你拥有的只是一把锤子,那么一切都成了钉子." 所以,这是我的锤子:SelectEquivalents.

这可以使用SelectEquivalents以下方法更快地完成:

SelectEquivalents[data1~Join~data2, #[[1]]&, #[[2]]&, {#1, Total[#2]}&]
Run Code Online (Sandbox Code Playgroud)

按顺序,第一个参数显然只是连接列表,第二个是它们被分组的(在这种情况下是第一个元素),第三个参数剥离字符串而只留下计数,第四个参数放置它返回与字符串as #1和列表中的计数一样#2.