jieba分词的入门应用
接上次对文本数据进行特征化,由于我上次用的是英文数据,英文句子单词与单词之间自带空格,所以
fit_transform(a)函数可以识别到一个个单词并将其提取为一个特征词存放在为列表里的一个字符串元素
英文文本数据
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
def countvec():
"""
对文本进行特征值化
:return: None
"""
cv = CountVectorizer()
data = cv.fit_transform(["life is short,i like python", "life is long,i dislike python"])
print(cv.get_feature_names())
print(data.toarray())
return None
if __name__ == "__main__":
countvec()
输出结果
当我将文本换成中文的话,结果又如何呢?
中文文本数据
将
data = cv.fit_transform(["life is short,i like python", "life is long,i dislike python"])
替换成
data = cv.fit_transform(["人生苦短,我喜欢python", "人生漫长,我不用python"])
此时的输出结果
很显然,**fit_transform(a)**函数并不能理解中文中的分词语境,它只会通过空格键以及标点符号来进行分词,这样一来,它统计的是以一句话或者半句话为单位来进行特征化,我们收集这些数据意义并不大。
由于中文的特殊性,这时候就需要一个能够识别中文语境并对其进行准确分词的工具。
jieba分词工具就是一个很方便的分词工具
jieba分词模块的入门简单应用
**jieba.cut(str):**将字符串分割好并生成一个字符串(词语)生成器返回
**list(wor1):**将该生成器迭代一遍并将内容强制转换成一个列表存储
**str.join(li1):**将列表(li1)里的所有元素拼接起来并且在每一个拼接处塞一个字符串str,返回值为一个字符串变量
CountVectorizer,fit_transform(list),get_feature_names(),toarray()等这个类与方法详情见: sklearn特征抽取API,这里不多加赘述。
1、导包
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
import jieba
2、定义数据集
str1= "今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。"
str2 = "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。"
str3 = "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"
3、定义分词函数
def cutword():
#worx是一个生成器,可以被迭代输出,但不能直接输出
#jieba.cut(str)作用是将字符创str分词之后用一个生成器
wor1 = jieba.cut(str1)
wor2 = jieba.cut(str2)
wor3 = jieba.cut(str3)
wor1,wor2,wor3均为jieba.cut返回的一个生成器
#用list函数将字符串强制转换成列表
#type(wor1)
#print(wor2)
li1 = list(wor1)
li2 = list(wor2)
li3 = list(wor3)
#print(type(li1))
#print(li1)
将该生成器迭代一遍并将内容强制转换成一个列表存储
a1 = ' '.join(li1)
a2 = ' '.join(li2)
a3 = ' '.join(li3)
#print(type(a1))
#print(a1)
此为将列表li1中的各个字符串元素拼接成一个完整的字符串,并在拼接处用空格键(’ ')插入
return a1, a2, a3
返回这三个字符串a1,a2,a3
4、对已做过分词处理的数据集实行特征化
def hanzivec():
'''
中文特征值化
:return:
'''
a1, a2, a3 = cutword()
print(a1,a2,a3)
#print((a1,a2,a3))
cv = CountVectorizer()
data = cv.fit_transform([a1,a2,a3])
print(cv.get_feature_names())
print(data.toarray())
return None
5、定义主函数
if __name__ == "__main__":
hanzivec()
''' wor1 = jieba.cut(str1)
print(type(wor1))
lis = []
for n in wor1:
lis.append(n)
print(n)
for n in lis:
print(n)
'''
6、输出结果
#今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。 我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到 宇宙 时 , 我们 是 在 看 它 的 过去 。 如果 只用 一种 方式 了解 某样 事物 , 你 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。
# Prefix dict has been built successfully.
#['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '这样']
注:注释部分可对该模块实现分词并特征化的各个函数的关键语句的实现原理进行进一步深入理解,比如:生成器的作用和原理、返回值的类型,以及print(a1,a2,a3)与print((a1,a2,a3))的区别等等。
因为水平有限,初学菜鸡,写得详细一点只为了能让我自己下次复习的时候能够看得清楚明白