1. 基本特征提取
即使我们对NLP没有充足的知识储备,但是我们可以使用python来提取文本数据的几个基本特征。在开始之前,我们使用pandas将数据集加载进来,以便后面其他任务的使用,数据集是Twitter情感文本数据集。
import pandas as pd train=pd.read_csv("files/data/python46-data/train_E6oV3lV.csv") print(train.head(10))
id label tweet 0 1 0 @user when a father is dysfunctional and is s... 1 2 0 @user @user thanks for #lyft credit i can't us... 2 3 0 bihday your majesty 3 4 0 #model i love u take with u all the time in ... 4 5 0 factsguide: society now #motivation 5 6 0 [2/2] huge fan fare and big talking before the... 6 7 0 @user camping tomorrow @user @user @user @use... 7 8 0 the next school year is the year for exams.ð��... 8 9 0 we won!!! love the land!!! #allin #cavs #champ... 9 10 0 @user @user welcome here ! i'm it's so #gr...
1.1 词汇数量
对每一条推文,我们可以提取的最基本特征之一就是词语数量。这样做的初衷就是通常情况下,负面情绪评论含有词语数量比正面情绪评论多。
我们可以简单地调用split函数,将句子切分:
train['word_count']=train['tweet'].apply(lambda x:len(str(x).split(" "))) train[['tweet','word_count']].head()
1.2 字符数量
选择字符数量作为特征的原因和前一个特征一样。在这里,我们直接通过字符串长度计算每条推文字符数量
train['char_count']=train['tweet'].str.len() train[['tweet','char_count']].head()
注意这里字符串的个数包含了推文中的空格个数,我们根据需要自行去除掉
1.3 平均词汇长度
我们接下来将计算每条推文的平均词汇长度作为另一个特征,这个有可能帮助我们改善模型。将每条推文所有单词的长度然后除以每条推文单词的个数,即可作为平均词汇长度
def avg_word(sentence): words=sentence.split() return (sum(len(word) for word in words)/len(words)) train['avg_word']=train['tweet'].apply(lambda x:avg_word(x)) train[['tweet','avg_word']].head()
1.4 停用词的数量
通常情况下,在解决NLP问题时,首要任务时去除停用词(stopword)。但是有时计算停用词的数量可以提供我们之前失去的额外信息。下面关于停用词的解释:
为节省存储空间和提高搜索效率,搜索引擎在索引页面或处理搜索请求时会自动忽略某些字或词,这些字或词即被称为Stop Words(停用词)。通常意义上,Stop Words大致为如下两类:
- 这些词应用十分广泛,在Internet上随处可见,比如“Web”一词几乎在每个网站上均会出现,对这样的词搜索引擎无 法保证能够给出真正相关的搜索结果,难以帮助缩小搜索范围,同时还会降低搜索的效率;
- 这类就更多了,包括了语气助词、副词、介词、连接词等,通常自身 并无明确的意义,只有将其放入一个完整的句子中才有一定作用,如常见的“的”、“在”之类。
在这里,我们导入NLTK库中的stopwors模块
from nltk.corpus import stopwords stop=stopwords.words('english') train['stopwords']=train['tweet'].apply(lambda sen:len([x for x in sen.split() if x in stop])) train[['tweet','stopwords']].head()
1.5 特殊字符的数量
一个比较有趣的特征就是我们可以从每个推文中提取“#”和“@”符号的数量。这也有利于我们从文本数据中提取更多信息
这里我们使用startswith
函数来处理
train['hashtags']=train['tweet'].apply(lambda sen:len([x for x in sen.split() if x.startswith("#")])) train[['tweet','hashtags']].head()
1.6 数字的数量
这个特征并不常用,但是在做相似任务时,数字数量是一个比较有用的特征
train['numerics']=train['tweet'].apply(lambda sen:len([x for x in sen.split() if x.isdigit()])) train[['tweet','numerics']].head()
1.7 大写单词的数量
“Anger”或者 “Rage”通常情况下使用大写来表述,所以有必要去识别出这些词
train['upper']=train['tweet'].apply(lambda sen:len([x for x in sen.split() if x.isupper()])) train[['tweet','upper']].head()