Wolfram mathematica 组合词频数据列表

Wolfram mathematica 组合词频数据列表,wolfram-mathematica,word-frequency,Wolfram Mathematica,Word Frequency,这似乎是一个显而易见的问题,但列表上的教程和文档还没有发布。许多问题都源于我的文本文件(数百MB)的巨大规模,以及我试图将它们归结为我的系统可以管理的东西。因此,我把我的工作分成了几个部分,现在正试图把结果结合起来 我有多个词频表(~40个)。这些列表可以通过Import[]获取,也可以作为Mathematica中生成的变量获取。每个列表显示如下,并使用Tally[]和Sort[]命令生成: {{“the”,42216},{“of”,24903},{“and”,18624},{“n”,16850

这似乎是一个显而易见的问题,但列表上的教程和文档还没有发布。许多问题都源于我的文本文件(数百MB)的巨大规模,以及我试图将它们归结为我的系统可以管理的东西。因此,我把我的工作分成了几个部分,现在正试图把结果结合起来

我有多个词频表(~40个)。这些列表可以通过Import[]获取,也可以作为Mathematica中生成的变量获取。每个列表显示如下,并使用Tally[]和Sort[]命令生成:

{{“the”,42216},{“of”,24903},{“and”,18624},{“n”,16850},{“in”,
16164},{“de”,14930},{“a”,14660},{“to”,14175},{“la”,7347}, {“was”,6030},{“l”,5981},{“le”,5735},{“屠宰场”, 1} ,{“abattent”,1},{“abattagen”,1},{“abattage”,1}, {“减弱”,1},{“放弃”,1},{“后退”,1},{“后退”,1},{“后退”,1}, {“aase”,1},{“aaijaut”,1},{“aaaah”,1},{“aaa”,1}

下面是第二个文件的示例:

{{“the”,30419},{“n”,20414},{“de”,19956},{“of”,16262},{“and”,
14488},{“到”,12726},{“a”,12635},{“in”,11141},{“la”,10739}, {“et”,9016},{“les”,8675},{“le”,7748}, {“abattation”,1},{“abattagen”,1},{“abattage”,1},{“abattage”, 1} ,{“放弃”,1},{“放弃”,1},{“放弃”,1},{“放弃”,1},{“放弃”,1}, {“aaijaut”,1},{“aaaah”,1},{“aaa”,1}


我想将它们组合起来,以便频率数据聚合:即,如果第二个文件中出现了30419个“the”,并连接到第一个文件,则它应该返回出现72635个(当我在整个集合中移动时,依此类推)。

尝试
ReplaceRepeated

加入名单。然后使用

//. {{f1___, {a_, c1_}, f2___, {a_, c2_}, f3___} -> {f1, f2, f3, {a, c1 + c2}}}

尝试使用哈希表,如下所示。首先要做好准备:

ClearAll[freq];
freq[_] = 0;
现在eg
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
*)
freq["the"]
72635
然后是下一个列表

Scan[(freq[#[[1]]] += #[[2]]) &, lst2]
之后,例如

freq["the"]
(*
42216
*)
freq["the"]
72635

freq["safas"]
(*
0
*)

听起来您需要使用GatherBy

假设您的两个列表分别命名为
data1
data2
,然后使用

{#[[1, 1]], Total[#[[All, 2]]]} & /@ GatherBy[Join[data1, data2], First]
这很容易推广到任意数量的列表,而不仅仅是两个。

有句老话,“如果你只有一把锤子,一切都会变成一颗钉子。”所以,这是我的锤子:

使用
SelectEquivalents
可以更快地完成此操作:

SelectEquivalents[data1~Join~data2, #[[1]]&, #[[2]]&, {#1, Total[#2]}&]

按照顺序,第一个参数显然只是连接的列表,第二个参数是它们的分组依据(在本例中是第一个元素),第三个参数去掉字符串,只留下计数,第四个参数将其与字符串组合为
#1
,列表中的计数为
#2

这是一个直接的
Sow
/
收获
函数:

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}

这真的很快!但是,有没有一种方法可以再次输出带有最终结果的列表-即所有术语的聚合列表(即{“the”,72635},{“of”,41165}…[可以是任何格式]@ian.milligan试试看,我确信有更快的方法。在我的编辑中,我放置了{a,c1+c2}在规则输出的最后,为了节省一点时间。虽然概念上很有趣,但速度非常慢。@ian.milligan,也可以查看
SelectEquivalents
。我个人不会将所有内容都设置为
选项,但他的变体非常灵活。而且,这两个版本都能够在
Ga中运行therBy
。一个密切相关的问题:也有点相关:另外,acl方法的紧凑形式特别聪明。不过,在
eaw
实现中,我确实有一个问题,为什么在
Sow
语句后加上分号?@rcollyer这是一个好问题。这是一个老习惯,但可能不是一个好习惯。这就是问题y提醒我,我没有使用该表达式的直接结果,我曾经认为它更有效,但事实似乎并非如此。它确实具有抑制大输出的优点,如果我忘记了
[[2]],即使使用骨架显示,格式化也会非常慢<代码> >代码> Re> <代码>。我应该考虑使用<代码>扫描< /COD>或<代码> do>代码>。