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来做到这一点
如果你完全按照你写的方式存储你的最终特征向量,我想我可以想出一些改进.
内存问题是由于功能(文本)重复这么多次,令牌也是如此.考虑这个过程:
首先,存储所有不同的特征(并给出索引).
例如,
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次.特征空间的大小可以减去一半甚至更小.