理论课:C1W1.Sentiment Analysis with Logistic Regression
理论课: C1W1.Sentiment Analysis with Logistic Regression
预处理
主要任务是完成对推文的预处理函数,主要使用NLTK软件包对 Twitter 数据集进行预处理。
导入包
- import nltk # Python library for NLP
- from nltk.corpus import twitter_samples # sample Twitter dataset from NLTK
- import matplotlib.pyplot as plt # library for visualization
- import random # pseudo-random number generator
复制代码 下载twitter_samples可以运行:
或者
- nltk.download('twitter_samples')
复制代码 假如下载twitter_samples失败,可以到https://www.nltk.org/nltk_data/,手工下载twitter_samples.zip后放corpora目次,不用解压。
Twitter dataset简介
NLTK 的推特样本数据集分为正面推文和负面推文。此中包罗 5000 条正面推文和 5000 条负面推文。这些类别之间的正确匹配并非巧合。这样做的目的是为了得到一个均衡的数据集。这并不能反映及时 Twitter 流中正面和负面类别的真实分布(正面大于负面)。这只是因为均衡数据集简化了情感分析所需的大多数盘算方法的计划。
下载并导入乐成后可以使用以下代码加载数据:
- # select the set of positive and negative tweets
- all_positive_tweets = twitter_samples.strings('positive_tweets.json')
- all_negative_tweets = twitter_samples.strings('negative_tweets.json')
复制代码 打印正面和负面推文的数量,打印数据集的数据结构:
- print('Number of positive tweets: ', len(all_positive_tweets))
- print('Number of negative tweets: ', len(all_negative_tweets))
- print('\nThe type of all_positive_tweets is: ', type(all_positive_tweets))
- print('The type of a tweet entry is: ', type(all_negative_tweets[0]))
复制代码
数据类型是列表,列表中的推文是字符串类型,下面使用Matplotlib 的 pyplot 库进行可视化:
- # Declare a figure with a custom size
- fig = plt.figure(figsize=(5, 5))
- # labels for the two classes
- labels = 'Positives', 'Negative'
- # Sizes for each slide
- sizes = [len(all_positive_tweets), len(all_negative_tweets)]
- # Declare pie chart, where the slices will be ordered and plotted counter-clockwise:
- plt.pie(sizes, labels=labels, autopct='%1.1f%%',
- shadow=True, startangle=90)
- # Equal aspect ratio ensures that pie is drawn as a circle.
- plt.axis('equal')
- # Display the chart
- plt.show()
复制代码
查察原始文本
随机打印一条正面推文和一条负面推文。代码在字符串的开头添加了一个颜色标记,以进一步区分两者(原推文会有脏话):
- # print positive in greeen
- print('\033[92m' + all_positive_tweets[random.randint(0,5000)])
- # print negative in red
- print('\033[91m' + all_negative_tweets[random.randint(0,5000)])
复制代码 处理原始文本
数据预处理是任何呆板学习项目的关键步骤之一。它包括在将数据输入呆板学习算法之前对数据进行清理和格式化。对于 NLP,预处理步骤通常包括以下任务:
分词
大/小写
删除停顿词和标点符号
词干化
这里只选取一条推文为例,看看每一个预处理步骤是如何转换的。
- # Our selected sample. Complex enough to exemplify each step
- tweet = all_positive_tweets[2277]
- print(tweet)
复制代码 效果:
接下来要下载停用词:
- #download the stopwords from NLTK
- nltk.download('stopwords')
复制代码 下载失败后手工安装,下载stopwords.zip后放corpora目次
导入以下库:
- import re # library for regular expression operations
- import string # for string operations
- from nltk.corpus import stopwords # module for stop words that come with NLTK
- from nltk.stem import PorterStemmer # module for stemming
- from nltk.tokenize import TweetTokenizer # module for tokenizing strings
复制代码 处理超链接、Twitter 标记和样式
使用re库在推特上执行正则表达式操作。我们将定义搜刮模式,并使用 sub() 方法用空字符(即 '')替换来移除匹配的字符。
- print('\033[92m' + tweet)
- print('\033[94m')
- # remove old style retweet text "RT"
- tweet2 = re.sub(r'^RT[\s]+', '', tweet)
- # remove hyperlinks
- tweet2 = re.sub(r'https?://[^\s\n\r]+', '', tweet2)
- # remove hashtags
- # only removing the hash # sign from the word
- tweet2 = re.sub(r'#', '', tweet2)
- print(tweet2)
复制代码 效果:
分词
使用NLTK中的tokenize模块进行操作(中文得用别的分词库):
- print()
- print('\033[92m' + tweet2)
- print('\033[94m')
- # instantiate tokenizer class
- tokenizer = TweetTokenizer(preserve_case=False, strip_handles=True,
- reduce_len=True)
- # tokenize tweets
- tweet_tokens = tokenizer.tokenize(tweet2)
- print()
- print('Tokenized string:')
- print(tweet_tokens)
复制代码
去除标点和停用词
这里加载是英文停用词,也有中文专用的停用词
- #Import the english stop words list from NLTK
- stopwords_english = stopwords.words('english')
- print('Stop words\n')
- print(stopwords_english)
- print('\nPunctuation\n')
- print(string.punctuation)
复制代码
可以看到,上面的停用词表包罗了一些在某些语境中可能很紧张的词。这些词包括 i、not、between、because、won、against 等。在某些应用中,您可能必要自定义停用词列表。在我们的练习中,我们将使用整个列表。
关于标点符号,我们在前面已经提到,在处理推文时应保存某些分组,如" |