第三章(文本数据:展平、过滤和分块)
1. Bag-of-X: 将文本信息转化为向量
统计各个词出现次数,能够根据词频进行文本分类,也同样用于信息检索。
1)Bag-of-Words:
将文本转化为平面向量,词以及文本中出现次数。相当于将文本映射到一个n维空间。
但是,这种表示方式会破坏整体的意思,换言之,不能表征词与词之间的联系。
2)Bag-of-n-Grams:
是上种的扩展版(但没有解决根本问题,n表示取多少词组做统计),此方法能够表征的信息更多,但是随之引发代价也增加。
from sklearn.feature_extraction.text import CountVectorizer
bigram_converter = CountVectorizer(ngram_range=(2,2))
bigram_converter.fit(text['one'])
bigrams = bigram_converter.get_feature_names()
2. 滤波(类似消除噪声,去掉不重要的信息):
1)Stopwords:
一般句子中的介词、冠词等意义不大,可以滤掉。Python NLP package NLTK 其中包含stopwords列表。
2)Frequency-Based Filtering:
统计各词出现频率,根据词频进行滤波,一般介词等之类出现次数比较多,但是如何选择滤除阈值还是比较重要的,需要手动选择。
其次,根据任务可能还需要过滤掉异常的单词(模糊的或拼写错误),异常词在计数时,存入garbage bin。
3)词根:
“flower” 与“flowers”属于同一词根,识别方法有基于语言规则及其他观察统计数据。Porter stemmer 是最广泛的免费的英语词干工具。
import nltk
stemmer = nltk.stem.porter.PorterStemmer()
stemmer.stem('flowers')
u'flower'
3. 短语:
1)解析和标记化:
当数据字符串不仅仅是纯文本需要进行解析(需要注意字符串编码,像 ASCII 、Unicode,否则标记可能会出错)。
操作:将字符串 - 字符序列 - 转换为标记序列。然后将每个标记计为一个单词,进行词频统计,标记生成器需要知道哪些字符表示标记结束或开始, 空格字符通常是好的分隔符。
word2vec需要首先将文档解析为句子,然后进一步将每个句子标记为单词。
2)词组的搭配提取:
可以使用n-grams。
判定两个词是偶然组合的,还是出现比较频繁。 解决这个问题的统计机制称为假设检验。
似然函数L(data; H)表示在单词对依照独立或非独立模型,观察到数据集中单词出现频率。
另外一种检验方式:逐点互信息方法,这种方法对异常词会很敏感,一般不用。
3)Chunking and part-of-speech tagging(生成更长的短语):
Chunking比找n-gram更复杂,因为它使用规则模型形成基于词性的标记序列。
Python 库, 如 NLTK, spaCy, TextBlob
import spacy
nlp = spacy.load('en')doc_df = review_df['text'].apply(nlp)from textblob import TextBlob
blob_df = review_df['text'].apply(TextBlob)两种方式最后得到的结果不尽相同,规则不一样,根据自己的需求选择或制定自己专属。
第四章(特征尺度的影响:从Bag-of-Words到Tf-Idf)
1. Tf-Idf:单词包的简单转折,也属于scaling
它代表术语频率 - 逆文档频率
Tf-Idf使得稀有词汇更突出,削弱普通词汇。
tfidf_trfm = text.TfidfTransformer(norm=None)
X_tr_tfidf = tfidf_trfm.fit_transform(X_tr_bow)X_te_tfidf = tfidf_trfm.transform(X_te_bow)逻辑回归,当输入的特征比数据要多时,训练出的模型是不确定的,因此需要增加正则化,正则参数属于超参数,一般使用网格搜索确定。
k-fold cross validation用于评价模型关于噪声的影响。
Tf-Idf与ℓ2归一化均属于以上数据矩阵关于列操作。该矩阵会出现特征线性相关。Tf-Idf与ℓ2归一化对特征进行scaling后,加速模型收敛,ℓ2归一化相较于其他两个收敛更快,但是容易出现过拟合。