Text 从已排序的短语列表中提取频率数据

Text 从已排序的短语列表中提取频率数据,text,wolfram-mathematica,Text,Wolfram Mathematica,在完成了关于列表操作的文档/过去的问题之后,我的回答是空白的——许多案例涉及数字,而我正在处理大量文本 我有一个常见的三字短语(三角形)的排序列表,它们出现在大量文本信息中,通过Mathematica的Partition[]、Tally[]和Sort[]命令生成。我正在操作的数据类型示例(我有数百个这样的文件): {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{

在完成了关于列表操作的文档/过去的问题之后,我的回答是空白的——许多案例涉及数字,而我正在处理大量文本

我有一个常见的三字短语(三角形)的排序列表,它们出现在大量文本信息中,通过Mathematica的Partition[]、Tally[]和Sort[]命令生成。我正在操作的数据类型示例(我有数百个这样的文件):

{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{wa,wa,wa,wa,wa,wa,wa,wa,wa,wa,wa,wa,wa,wa,wa,wa,WA0,WA0},WA0,WA0,WA0,wa,wa,WA0},WA0},66,66,66,66,66,66,66,66,66,66,66,66,66},66,66},66},66,66},66},66},66},66},66},66},66},66},66},66},66},{{{{{{{{{i,want,to},30},{{back,to,me},29},{{of,an,xke},1}


我希望搜索这个文件,这样如果输入是“生命的意义”,它就会返回“42”。我觉得我一定忽略了一些明显的东西,但在修补了一下之后,我碰到了一堵墙。Mathematica在其文档中的数量非常多,即。。好吧,这并不奇怪。

假设您可以以您概述的形式将数据加载到Mathematica中,一件非常简单的事情就是创建一个哈希表,其中您的三角形将是(复合)键。这是您的样品(您提供的部分):

以下是创建哈希表的一种可能方法:

Clear[trigramHash];
(trigramHash[Sequence @@ #1] = #2) & @@@ trigrams;
现在,我们像这样使用它

In[16]:= trigramHash["meaning","of","life"]
Out[16]= 42
当然,如果您执行许多搜索,这种方法将是有益的

编辑

如果您有许多文件,并且希望在Mathematica中高效地搜索它们,那么可以使用上述哈希机制将所有文件转换为
.mx
二进制Mathematica文件。这些文件针对快速加载进行了优化,并作为要存储的定义的持久化机制。以下是它的工作原理:

In[20]:= DumpSave["C:\\Temp\\trigrams.mx",trigramHash]
Out[20]= {trigramHash}

In[21]:= Quit[]

In[1]:= Get["C:\\Temp\\trigrams.mx"]
In[2]:= trigramHash["meaning","of","life"]
Out[2]= 42

使用
DumpSave
创建
.mx
文件。因此,建议的过程是将数据逐个文件加载到Mathematica中,创建散列(您可以使用
子值
使用文件的索引索引特定的散列表),然后将这些定义保存到
.mx
文件中。通过这种方式,您可以快速加载和快速搜索,并且您可以自由决定在任何给定时间将数据的哪一部分加载到Mathematica中(几乎没有性能损失,通常与文件加载相关)。

这可能不如Leonid给出的解决方案快,但是你可以把你的配对列表变成一个规则列表

In[1]:= trigrams = {{{"wa", "wa", "wa"}, 66}, {{"i", "love", "you"}, 
    62}, {{"la", "la", "la"}, 50}, {{"meaning", "of", "life"}, 
    42}, {{"on", "come", "on"}, 40}, {{"come", "on", "come"}, 
    40}, {{"yeah", "yeah", "yeah"}, 38}, {{"no", "no", "no"}, 
    36}, {{"we", "re", "gonna"}, 36}, {{"you", "love", "me"}, 
    35}, {{"in", "love", "with"}, 32}, {{"the", "way", "you"}, 
    30}, {{"i", "want", "to"}, 30}, {{"back", "to", "me"}, 
    29}, {{"of", "an", "xke"}, 1}};

In[2]:= trigramRules = Rule @@@ trigrams;
如果你愿意的话,你可以用一个类似于Leonid函数的函数来表示

In[3]:= trigram[seq__String] := {seq} /. trigramRules

In[4]:= trigram["meaning", "of", "life"]

Out[4]= 42

由于您有一个非常大的对列表,因此可以通过使用加快生成规则的应用。也就是说,除了使用

trigramRules = Dispatch[Rule @@@ trigrams]

这是将字符串中的单个单词放入列表的一种方法

In[262]:= str = "meaning, of, life"; ReadList[
 StringToStream[str], Word, WordSeparators -> {",", " "}]

Out[262]= {"meaning", "of", "life"}
您可以将其用于案例或其他形式的查找,以获得结果(非常可疑,该数字…)

---编辑---

通过“查找”,我想到了莱昂尼德·希夫林所展示的那种机制。我不确定遇到的困难是这个,还是简单地从字符串转换为三元组列表。我(只)展示了管理后者的方法

---结束编辑---

---编辑2---

注释显示了避免读取列表的方法。让我记录在案,我很高兴我找到了这种方法。下面是我在最初的回复中输入的代码,当我意识到有一个更简洁的代码时,将其替换

str = "meaning, of, life";
commaposns = StringPosition[str, ", "];
substrposns = 
  Partition[
   Join[{1}, 
    Riffle[commaposns[[All, 1]] - 1, commaposns[[All, 2]] + 1], {-1}],
    2];
substrs = Map[StringTake[str, #] &, substrposns]

Out[259]= {"meaning", "of", "life"}
底线(几乎是字面意义上的):我可以像其他人一样找到复杂的方法,而且比大多数方法都好

---结束编辑---


丹尼尔·利奇特布拉是个老问题。。但是现在我们有了
协会

lookup = Association[Rule @@@ trigrams];
lookup[{"come", "on", "come"}]
四十

甚至

lookup = Association[
   Rule[StringJoin@Riffle[#1, " "], #2] & @@@ trigrams]

lookup["meaning of life"]
42


@莱昂尼德-我肯定几分钟前你的回答中没有
快讯
部分。。。现在我的“努力工作”是多余的!是的,你说得对。在我输入答案后,我立刻想到了这一点,我把答案放在了那里。它可能是在单一的编辑范围内,所以它没有显示为编辑。为了公平起见,我把这部分从我的答案中删除了。只需确保编辑您的文件以包含
分派
——否则此方法将无法用于大型文件+1.这些答案都是很好的-很好的解决问题的方法。我最诚挚的感谢+我错过了问题的那一部分。我发现类似于
DeleteCases[StringSplit[str,{“”,“}],“]”之类的东西稍微快一些。或者,如果您可以保证输入结构,
StringSplit[“生命的意义”、{“、}]
。并不是说这是搜索过程的限制部分…我也错过了这一部分-+1。太好了-这是一个非常方便的命令。再次衷心感谢您的帮助。第二次编辑中的代码让我头疼。(我不得不把它拆开,看看它到底在做什么)
f[{“意义”、“of”、“生命”]
应该会返回
几乎但不完全像42
WordData[]的帮助
字典查找[]
Wolfram Alpha是..而且它不可能出错,是吗?太好了-随着数据集的增长和处理时间的增加,我必须尝试一下.mx进程。非常感谢您对原始问题和这些总体问题的有见地的帮助。@ian.milligan很高兴我能提供帮助,也感谢您的接受。我不久前,我自己在Mathematica中玩单词和短语及其统计数据。希望有一天能回到它。另一种对这些活动有用的机制是
eaw
lookup = Association[ Rule[StringJoin@Riffle[#1, " "], #2] & @@@ trigrams] lookup["meaning of life"]