人们如何使用n-gram进行情绪分析,考虑到当n增加时,内存需求也会迅速增加?

时间:2014-11-09 03:45:28

标签: python nlp scikit-learn sentiment-analysis n-gram

我正在尝试使用Python对推文进行情感分析。

首先,我实施了一个n-gram模型。所以,让我们说我们的培训数据是

I am a good kid

He is a good kid, but he didn't get along with his sister much

Unigrams

<i, am, a, good, kid, he, but, didnt, get, along, with, his, sister, much>

双字母组

<(i am), (am a), (a good), (good kid), (he is), (is a), (kid but), (but he), (he didnt), (didnt get), (get along), (along with), (with his), (his sister), (sister much)>

八卦

<(i am a), (am a good), (a good kid), .........>

最终特征向量

<i, am, a, good, kid, he, but, didnt, get, along, with, his, sister, much, (i am), (am a), (a good), (good kid), (he is), (is a), (kid but), (but he), (he didnt), (didnt get), (get along), (along with), (with his), (his sister), (sister much), (i am a), (am a good), (a good kid), .........>

当我们为8000个左右的大型训练数据执行此操作时,特征向量的维数变得太大,导致我的计算机(RAM = 16GB)崩溃。

所以,当人们提到使用“n-gram”作为特征时,那里有100多篇论文,他们在谈论什么?难道我做错了什么?

人们总是为“n-gram”做一些功能选择吗?如果是这样,我应该选择哪种功能选择?

我正在使用scikit-learn来做到这一点

2 个答案:

答案 0 :(得分:5)

如果您完全按照自己的意愿存储最终的特征向量,我想我可以做出一些改进。

内存问题是由于功能(文本)重复这么多次,令牌也是如此。考虑这个过程:

首先,存储所有不同的特征(并给出索引)。

例如,

1 - feature1 - (我是)

2 - feature2 - (am a)

...

这会产生一个所谓的特征空间。

总共可能有数千个功能,甚至更多功能。但这应该是正常的。 然后,每个条目都可以重写为一系列数字,例如,

Entry1 -----&lt; 1,1,1,0,.... a_n&gt ;,其中第一个 1 表示feature1(我)在此条目中出现1次,和a_n是特征n的出现次数。

假设有许多功能且条目很短,这意味着在每个向量中都有太多的零。我们可以重写上一个向量,如下所示,

Entry1 ---- {1:1,2:1,3:1},表示Entry1的1/2/3特征的值为1,所有其他特征的值为零。 更短,不是吗?

最后,每个条目都表示为一个短向量,并为您的语料库提供一个大矩阵。 您的语料库现在可能看起来像这样:

{1:1,2:1,3:1}

{2:1,29:1,0299:1,20345:1}

...

16G RAM足以容纳8000个条目。你可以少用它。


而且,如果你得到太多不同的令牌(这意味着太多的功能)。构建特征空间时,可以做的是删除频率低于阈值的特征,比如3次。特征空间的大小可以减去一半甚至更小。

答案 1 :(得分:2)

正如检查员G4dget在评论中所说,你很少去高n-gram,例如n = 5或n = 6,因为你没有足够的训练数据来使它值得。换句话说,几乎所有6克的出现次数都是1.另外,引用inspectorG4dget的评论:

  

当这些论文谈论n-gram时,他们不是在谈论一个   可扩展的n - 他们通常谈论一个特定的n(其价值   可能会在结果或实验部分揭示)

所以,通常记忆不是最大的问题。使用非常大的语料库,您将在群集中拆分它们,然后在最后组合结果。您可以根据群集中每个节点的内存量进行拆分,或者如果处理流,则可以在每次填充内存时停止并上载结果(到中心节点)。

您可以进行一些优化。如果语料库被保存在存储器中,那么每个n-gram只需要是语料库中第一次出现的索引;字符串不需要重复。

如果您不介意多次传递,则第二次优化是使用(n-1)-gram结果跳过低于阈值的句子部分。例如。如果你只对那些出现3次以上的n-gram感兴趣,并且如果“他是一个聪明人”在4-gram分析中只有2,那么当你发现5克“他是一个聪明的人”狗“你可以扔掉它,因为你知道它只会发生一次或两次。这是一个以额外CPU为代价的内存优化。