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

P.C*_*.C. 5 python nlp n-gram sentiment-analysis scikit-learn

我正在尝试使用Python对Tweets进行情感分析.

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

I am a good kid

He is a good kid, but he didn't get along with his sister much
Run Code Online (Sandbox Code Playgroud)

Unigrams:

<i, am, a, good, kid, he, but, didnt, get, along, with, his, sister, much>
Run Code Online (Sandbox Code Playgroud)

Bigrams:

<(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)>
Run Code Online (Sandbox Code Playgroud)

Trigrams:

<(i am a), (am a good), (a good kid), .........>
Run Code Online (Sandbox Code Playgroud)

最终特征向量:

<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), .........>
Run Code Online (Sandbox Code Playgroud)

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

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

人们总是为"n-gram"做一些功能选择吗?如果是这样,我应该选择什么样的功能选择?

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

eas*_*dog 5

如果你完全按照你写的方式存储你的最终特征向量,我想我可以想出一些改进.

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

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

例如,

1 - feature1 - (我是)

2 - feature2 - (am a)

...

这会生成一个所谓的特征空间.

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

Entry1 ----- <1,1,1,0,... a_n>,其中第一个1表示feature1(i)在该条目中出现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,029:1,20345:1}

...

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


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