利用 Python、SciKit 和文本分类来实现行为分析(2)实战过程
 
- UID
- 1066743
|

利用 Python、SciKit 和文本分类来实现行为分析(2)实战过程
构建行为描述模型首先,使用 SciKit 的 CountVectorizer 构建一个基于术语计数的简单语料库描述。语料库对象是包含产品描述的一个简单字符串列表。
清单 2. 构建一个简单的术语计数1
2
3
4
5
| vectorizer = CountVectorizer(gmin_df=1)
corpus=[]
for bp in behavioral_profiles:
for pd in bp.product_descriptions:
corpus.append(pd.description)
|
SciKit 还有其他更先进的矢量器(vectorizers),比如 TFIDFVectorizer,它使用术语频率/逆文档频率 (TF/IDF) 加权来存储文档术语。TF/IDF 表示有助于让独特的术语(比如 Ozzy、 raver和 Bauhaus)的权重比反复出现的术语(比如 and、 the 和 for)的权重还要高。
接下来,将产品描述划分为单个单词,并建立一个术语字典。分析器在匹配过程中找到的每个术语被赋予一个与在结果矩阵中的列相对应的惟一整数索引:
fit_corpus = vectorizer.fit_transform(corpus)
备注:这个分词器配置(tokenizer configuration)也丢弃了单字符单词。
您可以使用 print vectorizer.get_feature_names()[200:210] 打印出一些特性,看看哪些单词被分词。此命令的输出如下所示。
清单 3. print 命令的输出1
2
| [u'better', u'between', u'beyond', u'biafra', u'big',
u'bigger', u'bill', u'billboard', u'bites', u'biting']
|
请注意,当前矢量器没有词干化的单词。词干化 是为词尾变化或派生的单词得到一个共同的基础或词根形式的过程。例如,big 是在前面列表中的 bigger 的一个常见词干。SciKit 不处理更复杂的分词(比如词干化、词簇化和复合断词),但您可以使用自定义分词器,比如那些来自 Natural Language Toolkit (NLTK) 库的那些分词器。关于自定义分词器的示例,请参见 。
分词过程(比如,词干化)有助于减少所需的训练实例的数量,因为如果某个单词有多种形式,而且不要求对每种形式都提供统计表示。您可以使用其他技巧来减少培训需求,比如使用类型字典。例如,如果您有所有哥特乐队的乐队名称列表,那么可以创建一个共同的文字标记,比如 goth_band,并在生成特性之前将它添加到您的描述中。通过使用这种方法,如果在描述中第一次遇到某个乐队,该模型处理此乐队的方式会与处理模型可以理解其模式的其他乐队的方式相同。对于本文中的模拟数据,我们要关心的不是减少培训需求,所以我们应该继续执行下一个步骤。
在机器学习中,出现这样的监督分类问题是因为首先要为一组观察定义一组特性和相应的目标,或者正确的标签。然后,所选择的算法会尝试相应的模型,该模型会找到最适合的数据,并且参照已知的数据集来最大限度地减少错误。因此,我们的下一步操作是构建特性和目标标签矢量(参见清单 4)。随机化观察总是一个好办法,因为它可以防止验证技术没有这样做。
清单 4. 构建特性和目标标签矢量1
2
3
4
5
6
| data_target_tuples=[ ]
for bp in behavioral_profiles:
for pd in bp.product_descriptions:
data_target_tuples.append((bp.type, pd.description))
shuffle(data_target_tuples)
|
接下来,组装矢量,如清单 5 所示。
清单 5. 组装矢量1
2
3
4
5
6
7
8
9
| X_data=[ ]
y_target=[ ]
for t in data_target_tuples:
v = vectorizer.transform([t[1]]).toarray()[0]
X_data.append(v)
y_target.append(t[0])
X_data=np.asarray(X_data)
y_target=np.asarray(y_target)
|
现在,您可以选择一个分类器并修整您的行为描述模型。在此之前,最好先评估模型,这样做只是为了确保该模型可用,然后再让客户试用。 |
|
|
|
|
|