机器学习sklearn之特征工程

特征工程将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的模型准确性。文章源码,仅供学习

1、字典特征提取

  • 作用:对字典数据进行特征值化
  • 类:sklearn.feature_extraction.DictVectorizer

DictVectorizer(sparse=True,…)

  • DictVectorizer.fit_transform(X)

    • X:字典或者包含字典的迭代器
    • 返回值:返回sparse矩阵
  • DictVectorizer.inverse_transform(X)

    • X:array数组或者sparse矩阵
    • 返回值:转换之前数据格式
  • DictVectorizer.get_feature_names()

    • 返回类别名称
  • DictVectorizer.transform(X)

    • 按照原先的标准转换

流程:

  1. 实例化类DictVectorizer
  2. 调用fit_transform方法输入数据并转换 注意返回格式 对于类别型的数据先转换成字典,然后进行特征的抽取
# 字典特征抽取
from sklearn.feature_extraction import DictVectorizer

# 1、准备数据
data = [
    {"city": "北京", "temperture": 30},
    {"city": "上海", "temperture": 60},
    {"city": "广州", "temperture": 20},
    {"city": "深圳", "temperture": 100}
]
# 2、实例化 DictVectorizer
dict_v = DictVectorizer(sparse=False)  # 不采用稀疏矩阵
# 3、调用fit_transform输入并转换数据
_data = dict_v.fit_transform(data)

print(_data)  # 字典数据特征值化的结果
print(dict_v.get_feature_names())  # 返回类别名称
print(dict_v.inverse_transform(_data))  # 返回之前的数据格式

结果显示:
[[  0.   1.   0.   0.  30.]
 [  1.   0.   0.   0.  60.]
 [  0.   0.   1.   0.  20.]
 [  0.   0.   0.   1. 100.]]
['city=上海', 'city=北京', 'city=广州', 'city=深圳', 'temperture']
[{'temperture': 30.0, 'city=北京': 1.0}, {'city=上海': 1.0, 'temperture': 60.0}, {'city=广州': 1.0, 'temperture': 20.0}, {'city=深圳': 1.0, 'temperture': 100.0}]

2、文本特征抽取

  • 作用:对文本数据进行特征值化
  • 类:sklearn.feature_extraction.text.CountVectorizer

CountVectorizer语法

  • CountVectorizer(max_df=1.0,min_df=1,…)
    • max_df,min_df整数:指每个词的所有文档词频数不小于最小值,每个文档中每个词的词频不超过此文档的最大值
    • max_df,min_df小数:每个词的次数/所有文档数量
    • 返回词频矩阵
  • CountVectorizer.fit_transform(X)
    • X:文本或者包含文本字符串的可迭代对象
    • 返回值:返回sparse矩阵
  • CountVectorizer.inverse_transform(X)
    • X:array数组或者sparse矩阵
    • 返回值:转换之前数据格式
  • CountVectorizer.get_feature_names()
    • 返回值:单词列表

流程:

  1. 实例化类CountVectorizer
  2. 调用fit_transform方法输入数据并转换 注意返回格式,利用toarray()进行sparse矩阵转换array数组
# 文本特征抽取
from sklearn.feature_extraction.text import CountVectorizer

data = ["人生 苦短,我爱 python", "人生 漫漫,不用 python"]

cv = CountVectorizer()
_data = cv.fit_transform(data)

print(_data)
print(_data.toarray())  # sparse矩阵转换为array数组
print(cv.get_feature_names())

结果显示:
  (0, 0)	1
  (0, 3)	1
  (0, 5)	1
  (0, 2)	1
  (1, 1)	1
  (1, 4)	1
  (1, 0)	1
  (1, 2)	1
[[1 0 1 1 0 1]
 [1 1 1 0 1 0]]
['python', '不用', '人生', '我爱', '漫漫', '苦短']

结巴分词是一个非常好用的中文分词工具,这里不详细说明,网上资料很多。官网链接

# 结巴分词
import jieba

text = "沙瑞金赞叹易学习的胸怀,是金山的百姓有福,可是这件事对李达康的触动很大。易学习又回忆起他们三人分开的前一晚,大家一起喝酒话别,易学习被降职到道口县当县长,王大路下海经商,李达康连连赔礼道歉,觉得对不起大家,他最对不起的是王大路,就和易学习一起给王大路凑了5万块钱,王大路自己东挪西撮了5万块,开始下海经商。没想到后来王大路竟然做得风生水起。沙瑞金觉得他们三人,在困难时期还能以沫相助,很不容易。"

cut_generator = jieba.cut(text)  # 返回一个生成器
# [i for i in cut_generator]

result = " ".join(cut_generator)  # 将序列中的元素以指定的字符连接生成一个新的字符串
print(result)
print(result.split())  # 转换成列表
with open("./result.txt", "w") as f:
    f.write(result)

返回结果:
沙 瑞金 赞叹 易 学习 的 胸怀 , 是 金山 的 百姓 有福 , 可是 这件 事对 李达康 的 触动 很大 。 易 学习 又 回忆起 他们 三人 分开 的 前一晚 , 大家 一起 喝酒 话别 , 易 学习 被 降职 到 道口 县当 县长 , 王 大路 下海经商 , 李达康 连连 赔礼道歉 , 觉得 对不起 大家 , 他 最 对不起 的 是 王 大路 , 就 和 易 学习 一起 给 王 大路 凑 了 5 万块 钱 , 王 大路 自己 东挪西撮 了 5 万块 , 开始 下海经商 。 没想到 后来 王 大路 竟然 做 得 风生水 起 。 沙 瑞金 觉得 他们 三人 , 在 困难 时期 还 能 以沫 相助 , 很 不 容易 。
['沙', '瑞金', '赞叹', '易', '学习', '的', '胸怀', ',', '是', '金山', '的', '百姓', '有福', ',', '可是', '这件', '事对', '李达康', '的', '触动', '很大', '。', '易', '学习', '又', '回忆起', '他们', '三人', '分开', '的', '前一晚', ',', '大家', '一起', '喝酒', '话别', ',', '易', '学习', '被', '降职', '到', '道口', '县当', '县长', ',', '王', '大路', '下海经商', ',', '李达康', '连连', '赔礼道歉', ',', '觉得', '对不起', '大家', ',', '他', '最', '对不起', '的', '是', '王', '大路', ',', '就', '和', '易', '学习', '一起', '给', '王', '大路', '凑', '了', '5', '万块', '钱', ',', '王', '大路', '自己', '东挪西撮', '了', '5', '万块', ',', '开始', '下海经商', '。', '没想到', '后来', '王', '大路', '竟然', '做', '得', '风生水', '起', '。', '沙', '瑞金', '觉得', '他们', '三人', ',', '在', '困难', '时期', '还', '能', '以沫', '相助', ',', '很', '不', '容易', '。']

可以看出:结巴分词对一些人名地名处理的并不好,可以手动添加词汇

# 对一些人名地名结巴分词处理的不好,我们可以人为的给结巴分词器加入词汇
import jieba

text = "沙瑞金赞叹易学习的胸怀,是金山的百姓有福,可是这件事对李达康的触动很大。易学习又回忆起他们三人分开的前一晚,大家一起喝酒话别,易学习被降职到道口县当县长,王大路下海经商,李达康连连赔礼道歉,觉得对不起大家,他最对不起的是王大路,就和易学习一起给王大路凑了5万块钱,王大路自己东挪西撮了5万块,开始下海经商。没想到后来王大路竟然做得风生水起。沙瑞金觉得他们三人,在困难时期还能以沫相助,很不容易。"

jieba.suggest_freq('沙瑞金', True)
jieba.suggest_freq('易学习', True)
jieba.suggest_freq('王大路', True)
jieba.suggest_freq('京州', True)

cut_generator = jieba.cut(text)  # 返回一个生成器

result = " ".join(cut_generator)  # 将序列中的元素以指定的字符连接生成一个新的字符串
print(result)

返回结果:
沙瑞金 赞叹 易学习 的 胸怀 , 是 金山 的 百姓 有福 , 可是 这件 事对 李达康 的 触动 很大 。 易学习 又 回忆起 他们 三人 分开 的 前一晚 , 大家 一起 喝酒 话别 , 易学习 被 降职 到 道口 县当 县长 , 王大路 下海经商 , 李达康 连连 赔礼道歉 , 觉得 对不起 大家 , 他 最 对不起 的 是 王大路 , 就 和 易学习 一起 给 王大路 凑 了 5 万块 钱 , 王大路 自己 东挪西撮 了 5 万块 , 开始 下海经商 。 没想到 后来 王大路 竟然 做 得 风生水 起 。 沙瑞金 觉得 他们 三人 , 在 困难 时期 还 能 以沫 相助 , 很 不 容易 。

同样的方法,处理第二段文本内容

# 同样,对第二段文本进行分词
import jieba

text = "沙瑞金向毛娅打听他们家在京州的别墅,毛娅笑着说,王大路事业有成之后,要给欧阳菁和她公司的股权,她们没有要,王大路就在京州帝豪园买了三套别墅,可是李达康和易学习都不要,这些房子都在王大路的名下,欧阳菁好像去住过,毛娅不想去,她觉得房子太大很浪费,自己家住得就很踏实。"

cut_generator = jieba.cut(text)
result = " ".join(cut_generator)
print(result)

with open("./result2.txt", "w") as f:
    f.write(result)

返回结果:
沙瑞金 向 毛娅 打听 他们 家 在 京州 的 别墅 , 毛娅 笑 着 说 , 王大路 事业有成 之后 , 要 给 欧阳 菁 和 她 公司 的 股权 , 她们 没有 要 , 王大路 就 在 京州 帝豪园 买 了 三套 别墅 , 可是 李达康 和 易学习 都 不要 , 这些 房子 都 在 王大路 的 名下 , 欧阳 菁 好像 去 住 过 , 毛娅 不想 去 , 她 觉得 房子 太大 很 浪费 , 自己 家住 得 就 很 踏实 。

对一些停用词需要剔除,可用的停用词表很多,这里给大家推荐几个,GitHub连接

# 使用停用词
with open("./stopwords-master/百度停用词表.txt", "rb") as f:
    stop_words = f.read().decode("utf-8")
    
# print(stop_words)
print(stop_words.splitlines())

返回结果:
['--', '?', '“', '”', '》', '--', 'able', 'about', 'above', 'according', 'accordingly', 'across', 'actually', 'after', 'afterwards', 'again', 'against', "ain't", 'all', 'allow', 'allows', 'almost', 'alone', 'along', 'already', 'also', 'although', 'always', 'am', 'among', 'amongst', 'an', 'and', 'another', 'any', 'anybody', 'anyhow', 'anyone', 'anything', 'anyway', 'anyways', 'anywhere', 'apart', 'appear', 'appreciate', 'appropriate', 'are', "aren't", 'around', 'as', "a's", 'aside', 'ask', 'asking', 'associated', 'at', 'available', 'away', 'awfully', 'be', 'became', 'because', 'become', 'becomes', 'becoming', 'been', 'before', 'beforehand', 'behind', 'being', 'believe', 'below', 'beside', 'besides', 'best', 'better', 'between', 'beyond', 'both', 'brief', 'but', 'by', 'came', 'can', 'cannot', 'cant', "can't", 'cause', 'causes', 'certain', 'certainly', 'changes', 'clearly', "c'mon", 'co', 'com', 'come', 'comes', 'concerning', 'consequently', 'consider', 'considering', 'contain', 'containing', 'contains', 'corresponding', 'could', "couldn't", 'course', "c's", 'currently', 'definitely', 'described', 'despite', 'did', "didn't", 'different', 'do', 'does', "doesn't", 'doing', 'done', "don't", 'down', 'downwards', 'during', 'each', 'edu', 'eg', 'eight', 'either', 'else', 'elsewhere', 'enough', 'entirely', 'especially', 'et', 'etc', 'even', 'ever', 'every', 'everybody', 'everyone', 'everything', 'everywhere', 'ex', 'exactly', 'example', 'except', 'far', 'few', 'fifth', 'first', 'five', 'followed', 'following', 'follows', 'for', 'former', 'formerly', 'forth', 'four', 'from', 'further', 'furthermore', 'get', 'gets', 'getting', 'given', 'gives', 'go', 'goes', 'going', 'gone', 'got', 'gotten', 'greetings', 'had', "hadn't", 'happens', 'hardly', 'has', "hasn't", 'have', "haven't", 'having', 'he', 'hello', 'help', 'hence', 'her', 'here', 'hereafter', 'hereby', 'herein', "here's", 'hereupon', 'hers', 'herself', "he's", 'hi', 'him', 'himself', 'his', 'hither', 'hopefully', 'how', 'howbeit', 'however', "i'd", 'ie', 'if', 'ignored', "i'll", "i'm", 'immediate', 'in', 'inasmuch', 'inc', 'indeed', 'indicate', 'indicated', 'indicates', 'inner', 'insofar', 'instead', 'into', 'inward', 'is', "isn't", 'it', "it'd", "it'll", 'its', "it's", 'itself', "i've", 'just', 'keep', 'keeps', 'kept', 'know', 'known', 'knows', 'last', 'lately', 'later', 'latter', 'latterly', 'least', 'less', 'lest', 'let', "let's", 'like', 'liked', 'likely', 'little', 'look', 'looking', 'looks', 'ltd', 'mainly', 'many', 'may', 'maybe', 'me', 'mean', 'meanwhile', 'merely', 'might', 'more', 'moreover', 'most', 'mostly', 'much', 'must', 'my', 'myself', 'name', 'namely', 'nd', 'near', 'nearly', 'necessary', 'need', 'needs', 'neither', 'never', 'nevertheless', 'new', 'next', 'nine', 'no', 'nobody', 'non', 'none', 'noone', 'nor', 'normally', 'not', 'nothing', 'novel', 'now', 'nowhere', 'obviously', 'of', 'off', 'often', 'oh', 'ok', 'okay', 'old', 'on', 'once', 'one', 'ones', 'only', 'onto', 'or', 'other', 'others', 'otherwise', 'ought', 'our', 'ours', 'ourselves', 'out', 'outside', 'over', 'overall', 'own', 'particular', 'particularly', 'per', 'perhaps', 'placed', 'please', 'plus', 'possible', 'presumably', 'probably', 'provides', 'que', 'quite', 'qv', 'rather', 'rd', 're', 'really', 'reasonably', 'regarding', 'regardless', 'regards', 'relatively', 'respectively', 'right', 'said', 'same', 'saw', 'say', 'saying', 'says', 'second', 'secondly', 'see', 'seeing', 'seem', 'seemed', 'seeming', 'seems', 'seen', 'self', 'selves', 'sensible', 'sent', 'serious', 'seriously', 'seven', 'several', 'shall', 'she', 'should', "shouldn't", 'since', 'six', 'so', 'some', 'somebody', 'somehow', 'someone', 'something', 'sometime', 'sometimes', 'somewhat', 'somewhere', 'soon', 'sorry', 'specified', 'specify', 'specifying', 'still', 'sub', 'such', 'sup', 'sure', 'take', 'taken', 'tell', 'tends', 'th', 'than', 'thank', 'thanks', 'thanx', 'that', 'thats', "that's", 'the', 'their', 'theirs', 'them', 'themselves', 'then', 'thence', 'there', 'thereafter', 'thereby', 'therefore', 'therein', 'theres', "there's", 'thereupon', 'these', 'they', "they'd", "they'll", "they're", "they've", 'think', 'third', 'this', 'thorough', 'thoroughly', 'those', 'though', 'three', 'through', 'throughout', 'thru', 'thus', 'to', 'together', 'too', 'took', 'toward', 'towards', 'tried', 'tries', 'truly', 'try', 'trying', "t's", 'twice', 'two', 'un', 'under', 'unfortunately', 'unless', 'unlikely', 'until', 'unto', 'up', 'upon', 'us', 'use', 'used', 'useful', 'uses', 'using', 'usually', 'value', 'various', 'very', 'via', 'viz', 'vs', 'want', 'wants', 'was', "wasn't", 'way', 'we', "we'd", 'welcome', 'well', "we'll", 'went', 'were', "we're", "weren't", "we've", 'what', 'whatever', "what's", 'when', 'whence', 'whenever', 'where', 'whereafter', 'whereas', 'whereby', 'wherein', "where's", 'whereupon', 'wherever', 'whether', 'which', 'while', 'whither', 'who', 'whoever', 'whole', 'whom', "who's", 'whose', 'why', 'will', 'willing', 'wish', 'with', 'within', 'without', 'wonder', "won't", 'would', "wouldn't", 'yes', 'yet', 'you', "you'd", "you'll", 'your', "you're", 'yours', 'yourself', 'yourselves', "you've", 'zero', 'zt', 'ZT', 'zz', 'ZZ', '一', '一下', '一些', '一切', '一则', '一天', '一定', '一方面', '一旦', '一时', '一来', '一样', '一次', '一片', '一直', '一致', '一般', '一起', '一边', '一面', '万一', '上下', '上升', '上去', '上来', '上述', '上面', '下列', '下去', '下来', '下面', '不一', '不久', '不仅', '不会', '不但', '不光', '不单', '不变', '不只', '不可', '不同', '不够', '不如', '不得', '不怕', '不惟', '不成', '不拘', '不敢', '不断', '不是', '不比', '不然', '不特', '不独', '不管', '不能', '不要', '不论', '不足', '不过', '不问', '与', '与其', '与否', '与此同时', '专门', '且', '两者', '严格', '严重', '个', '个人', '个别', '中小', '中间', '丰富', '临', '为', '为主', '为了', '为什么', '为什麽', '为何', '为着', '主张', '主要', '举行', '乃', '乃至', '么', '之', '之一', '之前', '之后', '之後', '之所以', '之类', '乌乎', '乎', '乘', '也', '也好', '也是', '也罢', '了', '了解', '争取', '于', '于是', '于是乎', '云云', '互相', '产生', '人们', '人家', '什么', '什么样', '什麽', '今后', '今天', '今年', '今後', '仍然', '从', '从事', '从而', '他', '他人', '他们', '他的', '代替', '以', '以上', '以下', '以为', '以便', '以免', '以前', '以及', '以后', '以外', '以後', '以来', '以至', '以至于', '以致', '们', '任', '任何', '任凭', '任务', '企图', '伟大', '似乎', '似的', '但', '但是', '何', '何况', '何处', '何时', '作为', '你', '你们', '你的', '使得', '使用', '例如', '依', '依照', '依靠', '促进', '保持', '俺', '俺们', '倘', '倘使', '倘或', '倘然', '倘若', '假使', '假如', '假若', '做到', '像', '允许', '充分', '先后', '先後', '先生', '全部', '全面', '兮', '共同', '关于', '其', '其一', '其中', '其二', '其他', '其余', '其它', '其实', '其次', '具体', '具体地说', '具体说来', '具有', '再者', '再说', '冒', '冲', '决定', '况且', '准备', '几', '几乎', '几时', '凭', '凭借', '出去', '出来', '出现', '分别', '则', '别', '别的', '别说', '到', '前后', '前者', '前进', '前面', '加之', '加以', '加入', '加强', '十分', '即', '即令', '即使', '即便', '即或', '即若', '却不', '原来', '又', '及', '及其', '及时', '及至', '双方', '反之', '反应', '反映', '反过来', '反过来说', '取得', '受到', '变成', '另', '另一方面', '另外', '只是', '只有', '只要', '只限', '叫', '叫做', '召开', '叮咚', '可', '可以', '可是', '可能', '可见', '各', '各个', '各人', '各位', '各地', '各种', '各级', '各自', '合理', '同', '同一', '同时', '同样', '后来', '后面', '向', '向着', '吓', '吗', '否则', '吧', '吧哒', '吱', '呀', '呃', '呕', '呗', '呜', '呜呼', '呢', '周围', '呵', '呸', '呼哧', '咋', '和', '咚', '咦', '咱', '咱们', '咳', '哇', '哈', '哈哈', '哉', '哎', '哎呀', '哎哟', '哗', '哟', '哦', '哩', '哪', '哪个', '哪些', '哪儿', '哪天', '哪年', '哪怕', '哪样', '哪边', '哪里', '哼', '哼唷', '唉', '啊', '啐', '啥', '啦', '啪达', '喂', '喏', '喔唷', '嗡嗡', '嗬', '嗯', '嗳', '嘎', '嘎登', '嘘', '嘛', '嘻', '嘿', '因', '因为', '因此', '因而', '固然', '在', '在下', '地', '坚决', '坚持', '基本', '处理', '复杂', '多', '多少', '多数', '多次', '大力', '大多数', '大大', '大家', '大批', '大约', '大量', '失去', '她', '她们', '她的', '好的', '好象', '如', '如上所述', '如下', '如何', '如其', '如果', '如此', '如若', '存在', '宁', '宁可', '宁愿', '宁肯', '它', '它们', '它们的', '它的', '安全', '完全', '完成', '实现', '实际', '宣布', '容易', '密切', '对', '对于', '对应', '将', '少数', '尔后', '尚且', '尤其', '就', '就是', '就是说', '尽', '尽管', '属于', '岂但', '左右', '巨大', '巩固', '己', '已经', '帮助', '常常', '并', '并不', '并不是', '并且', '并没有', '广大', '广泛', '应当', '应用', '应该', '开外', '开始', '开展', '引起', '强烈', '强调', '归', '当', '当前', '当时', '当然', '当着', '形成', '彻底', '彼', '彼此', '往', '往往', '待', '後来', '後面', '得', '得出', '得到', '心里', '必然', '必要', '必须', '怎', '怎么', '怎么办', '怎么样', '怎样', '怎麽', '总之', '总是', '总的来看', '总的来说', '总的说来', '总结', '总而言之', '恰恰相反', '您', '意思', '愿意', '慢说', '成为', '我', '我们', '我的', '或', '或是', '或者', '战斗', '所', '所以', '所有', '所谓', '打', '扩大', '把', '抑或', '拿', '按', '按照', '换句话说', '换言之', '据', '掌握', '接着', '接著', '故', '故此', '整个', '方便', '方面', '旁人', '无宁', '无法', '无论', '既', '既是', '既然', '时候', '明显', '明确', '是', '是否', '是的', '显然', '显著', '普通', '普遍', '更加', '曾经', '替', '最后', '最大', '最好', '最後', '最近', '最高', '有', '有些', '有关', '有利', '有力', '有所', '有效', '有时', '有点', '有的', '有着', '有著', '望', '朝', '朝着', '本', '本着', '来', '来着', '极了', '构成', '果然', '果真', '某', '某个', '某些', '根据', '根本', '欢迎', '正在', '正如', '正常', '此', '此外', '此时', '此间', '毋宁', '每', '每个', '每天', '每年', '每当', '比', '比如', '比方', '比较', '毫不', '没有', '沿', '沿着', '注意', '深入', '清楚', '满足', '漫说', '焉', '然则', '然后', '然後', '然而', '照', '照着', '特别是', '特殊', '特点', '现代', '现在', '甚么', '甚而', '甚至', '用', '由', '由于', '由此可见', '的', '的话', '目前', '直到', '直接', '相似', '相信', '相反', '相同', '相对', '相对而言', '相应', '相当', '相等', '省得', '看出', '看到', '看来', '看看', '看见', '真是', '真正', '着', '着呢', '矣', '知道', '确定', '离', '积极', '移动', '突出', '突然', '立即', '第', '等', '等等', '管', '紧接着', '纵', '纵令', '纵使', '纵然', '练习', '组成', '经', '经常', '经过', '结合', '结果', '给', '绝对', '继续', '继而', '维持', '综上所述', '罢了', '考虑', '者', '而', '而且', '而况', '而外', '而已', '而是', '而言', '联系', '能', '能否', '能够', '腾', '自', '自个儿', '自从', '自各儿', '自家', '自己', '自身', '至', '至于', '良好', '若', '若是', '若非', '范围', '莫若', '获得', '虽', '虽则', '虽然', '虽说', '行为', '行动', '表明', '表示', '被', '要', '要不', '要不是', '要不然', '要么', '要是', '要求', '规定', '觉得', '认为', '认真', '认识', '让', '许多', '论', '设使', '设若', '该', '说明', '诸位', '谁', '谁知', '赶', '起', '起来', '起见', '趁', '趁着', '越是', '跟', '转动', '转变', '转贴', '较', '较之', '边', '达到', '迅速', '过', '过去', '过来', '运用', '还是', '还有', '这', '这个', '这么', '这么些', '这么样', '这么点儿', '这些', '这会儿', '这儿', '这就是说', '这时', '这样', '这点', '这种', '这边', '这里', '这麽', '进入', '进步', '进而', '进行', '连', '连同', '适应', '适当', '适用', '逐步', '逐渐', '通常', '通过', '造成', '遇到', '遭到', '避免', '那', '那个', '那么', '那么些', '那么样', '那些', '那会儿', '那儿', '那时', '那样', '那边', '那里', '那麽', '部分', '鄙人', '采取', '里面', '重大', '重新', '重要', '鉴于', '问题', '防止', '阿', '附近', '限制', '除', '除了', '除此之外', '除非', '随', '随着', '随著', '集中', '需要', '非但', '非常', '非徒', '靠', '顺', '顺着', '首先', '高兴', '是不是', '说说', ' ']

下面对这些使用结巴分词后的文本数据进行特征工程:

# 中文特征值化(使用停用词)
from sklearn.feature_extraction.text import CountVectorizer

with open("./result.txt", "rb") as f:
    data1 = f.read().decode("GBK")
    
with open("./result2.txt", "rb") as f:
    data2 = f.read().decode("GBK")
    
with open("./stopwords-master/百度停用词表.txt", "rb") as f:
    stop_words = f.read().decode("utf-8")

stop_words = stop_words.split()
cv = CountVectorizer(stop_words=stop_words)

data = [data1, data2]

_data = cv.fit_transform(data)
print("中文特征值化:\n", _data.toarray()[:5])
print("特征名称:\n", cv.get_feature_names())
print("特征长度:\n", len(cv.get_feature_names()))

返回结果:
中文特征值化:
 [[2 2 0 2 0 1 0 1 0 1 0 1 0 1 1 1 0 1 1 1 5 0 0 4 0 2 0 1 0 0 1 0 1 2 0 0
  0 1 0 0 2 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 1]
 [0 0 1 0 1 0 1 0 2 0 1 0 2 0 0 0 1 0 0 0 0 1 1 0 1 0 1 0 2 1 0 1 0 1 2 3
  1 0 1 3 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0]]
特征名称:
 ['万块', '三人', '三套', '下海经商', '不想', '东挪西撮', '事业有成', '事对', '京州', '以沫', '公司', '分开', '别墅', '前一晚', '县当', '县长', '名下', '喝酒', '回忆起', '困难', '大路', '太大', '好像', '学习', '家住', '对不起', '帝豪园', '很大', '房子', '打听', '时期', '易学习', '有福', '李达康', '欧阳', '毛娅', '沙瑞金', '没想到', '浪费', '王大路', '瑞金', '百姓', '相助', '竟然', '股权', '胸怀', '触动', '话别', '赔礼道歉', '赞叹', '踏实', '这件', '连连', '道口', '金山', '降职', '风生水']
特征长度:
 57
# 中文特征值化(不使用停用词)
from sklearn.feature_extraction.text import CountVectorizer

with open("./result.txt", "rb") as f:
    data1 = f.read().decode("GBK")
    
with open("./result2.txt", "rb") as f:
    data2 = f.read().decode("GBK")

cv = CountVectorizer()

data = [data1, data2]

_data = cv.fit_transform(data)
print("中文特征值化:\n", _data.toarray()[:5])
print("特征名称:\n", cv.get_feature_names())
print("特征长度:\n", len(cv.get_feature_names()))

返回结果:
中文特征值化:
 [[2 2 2 0 2 0 0 1 0 0 1 0 2 1 0 1 0 1 1 1 1 0 1 1 1 1 2 5 0 0 0 4 0 1 2 0
  1 1 0 0 1 0 1 2 0 0 0 1 0 0 0 2 1 1 1 0 1 1 2 1 1 1 1 0 0 1 1 1 1 1 1]
 [0 0 0 1 0 1 1 0 1 1 0 2 1 0 1 0 2 0 0 0 1 1 0 0 0 0 0 0 1 1 1 0 1 0 0 1
  0 0 2 1 0 1 0 1 2 3 1 0 1 1 3 0 0 0 0 1 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0]]
特征名称:
 ['一起', '万块', '三人', '三套', '下海经商', '不想', '不要', '东挪西撮', '之后', '事业有成', '事对', '京州', '他们', '以沫', '公司', '分开', '别墅', '前一晚', '县当', '县长', '可是', '名下', '后来', '喝酒', '回忆起', '困难', '大家', '大路', '太大', '她们', '好像', '学习', '家住', '容易', '对不起', '帝豪园', '开始', '很大', '房子', '打听', '时期', '易学习', '有福', '李达康', '欧阳', '毛娅', '沙瑞金', '没想到', '没有', '浪费', '王大路', '瑞金', '百姓', '相助', '竟然', '股权', '胸怀', '自己', '觉得', '触动', '话别', '赔礼道歉', '赞叹', '踏实', '这些', '这件', '连连', '道口', '金山', '降职', '风生水']
特征长度:
 71

可见,使用停用词可以减少不必要的特征,也算是起到降维的作用了吧!

TF-IDF
TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。

  • TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
  • 类:sklearn.feature_extraction.text.TfidfVectorizer

TfidfVectorizer语法

  • TfidfVectorizer(stop_words=None,…)

    • 返回词的权重矩阵
  • TfidfVectorizer.fit_transform(X)

    • X:文本或者包含文本字符串的可迭代对象
    • 返回值:返回sparse矩阵
  • TfidfVectorizer.inverse_transform(X)

    • X:array数组或者sparse矩阵
    • 返回值:转换之前数据格式
  • TfidfVectorizer.get_feature_names()

    • 返回值:单词列表
# 使用TfidfVectorizer进行中文特征值化
from sklearn.feature_extraction.text import TfidfVectorizer

with open("./stopwords-master/百度停用词表.txt", "rb") as f:
    stop_words = f.read().decode("utf-8")

with open("./result.txt", "rb") as f:
    data1 = f.read().decode("GBK")
    
with open("./result2.txt", "rb") as f:
    data2 = f.read().decode("GBK")

data = [data1, data2]
stop_words = stop_words.split()

tf = TfidfVectorizer(stop_words=stop_words)

_data = tf.fit_transform(data)

print("中文特征值化:\n", _data.toarray())
print("特征名称:\n", tf.get_feature_names())
print("特征长度:\n", len(tf.get_feature_names()))

返回结果:
中文特征值化:
 [[0.2096282  0.2096282  0.         0.2096282  0.         0.1048141
  0.         0.1048141  0.         0.1048141  0.         0.1048141
  0.         0.1048141  0.1048141  0.1048141  0.         0.1048141
  0.1048141  0.1048141  0.52407051 0.         0.         0.4192564
  0.         0.2096282  0.         0.1048141  0.         0.
  0.1048141  0.         0.1048141  0.14915219 0.         0.
  0.         0.1048141  0.         0.         0.2096282  0.1048141
  0.1048141  0.1048141  0.         0.1048141  0.1048141  0.1048141
  0.1048141  0.1048141  0.         0.1048141  0.1048141  0.1048141
  0.1048141  0.1048141  0.1048141 ]
 [0.         0.         0.14212485 0.         0.14212485 0.
  0.14212485 0.         0.28424969 0.         0.14212485 0.
  0.28424969 0.         0.         0.         0.14212485 0.
  0.         0.         0.         0.14212485 0.14212485 0.
  0.14212485 0.         0.14212485 0.         0.28424969 0.14212485
  0.         0.14212485 0.         0.101123   0.28424969 0.42637454
  0.14212485 0.         0.14212485 0.42637454 0.         0.
  0.         0.         0.14212485 0.         0.         0.
  0.         0.         0.14212485 0.         0.         0.
  0.         0.         0.        ]]
特征名称:
 ['万块', '三人', '三套', '下海经商', '不想', '东挪西撮', '事业有成', '事对', '京州', '以沫', '公司', '分开', '别墅', '前一晚', '县当', '县长', '名下', '喝酒', '回忆起', '困难', '大路', '太大', '好像', '学习', '家住', '对不起', '帝豪园', '很大', '房子', '打听', '时期', '易学习', '有福', '李达康', '欧阳', '毛娅', '沙瑞金', '没想到', '浪费', '王大路', '瑞金', '百姓', '相助', '竟然', '股权', '胸怀', '触动', '话别', '赔礼道歉', '赞叹', '踏实', '这件', '连连', '道口', '金山', '降职', '风生水']
特征长度:
 57

显示两段文本内容中词语的权重

word_list = tf.get_feature_names()
weight_list = _data.toarray()

#打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重
for i in range(len(weight_list)):  
    print("-------第",i,"段文本的词语tf-idf权重------") 
    for j in range(len(word_list)):  
        print(word_list[j],weight_list[i][j]) 
        
返回结果:
-------第 0 段文本的词语tf-idf权重------
万块 0.2096282020164691
三人 0.2096282020164691
三套 0.0
下海经商 0.2096282020164691
不想 0.0
东挪西撮 0.10481410100823454
事业有成 0.0
事对 0.10481410100823454
京州 0.0
以沫 0.10481410100823454
公司 0.0
分开 0.10481410100823454
别墅 0.0
前一晚 0.10481410100823454
县当 0.10481410100823454
县长 0.10481410100823454
名下 0.0
喝酒 0.10481410100823454
回忆起 0.10481410100823454
困难 0.10481410100823454
大路 0.5240705050411727
太大 0.0
好像 0.0
学习 0.4192564040329382
家住 0.0
对不起 0.2096282020164691
帝豪园 0.0
很大 0.10481410100823454
房子 0.0
打听 0.0
时期 0.10481410100823454
易学习 0.0
有福 0.10481410100823454
李达康 0.1491521922580067
欧阳 0.0
毛娅 0.0
沙瑞金 0.0
没想到 0.10481410100823454
浪费 0.0
王大路 0.0
瑞金 0.2096282020164691
百姓 0.10481410100823454
相助 0.10481410100823454
竟然 0.10481410100823454
股权 0.0
胸怀 0.10481410100823454
触动 0.10481410100823454
话别 0.10481410100823454
赔礼道歉 0.10481410100823454
赞叹 0.10481410100823454
踏实 0.0
这件 0.10481410100823454
连连 0.10481410100823454
道口 0.10481410100823454
金山 0.10481410100823454
降职 0.10481410100823454
风生水 0.10481410100823454
-------第 1 段文本的词语tf-idf权重------
万块 0.0
三人 0.0
三套 0.1421248473147575
下海经商 0.0
不想 0.1421248473147575
东挪西撮 0.0
事业有成 0.1421248473147575
事对 0.0
京州 0.284249694629515
以沫 0.0
公司 0.1421248473147575
分开 0.0
别墅 0.284249694629515
前一晚 0.0
县当 0.0
县长 0.0
名下 0.1421248473147575
喝酒 0.0
回忆起 0.0
困难 0.0
大路 0.0
太大 0.1421248473147575
好像 0.1421248473147575
学习 0.0
家住 0.1421248473147575
对不起 0.0
帝豪园 0.1421248473147575
很大 0.0
房子 0.284249694629515
打听 0.1421248473147575
时期 0.0
易学习 0.1421248473147575
有福 0.0
李达康 0.10112299942192488
欧阳 0.284249694629515
毛娅 0.42637454194427243
沙瑞金 0.1421248473147575
没想到 0.0
浪费 0.1421248473147575
王大路 0.42637454194427243
瑞金 0.0
百姓 0.0
相助 0.0
竟然 0.0
股权 0.1421248473147575
胸怀 0.0
触动 0.0
话别 0.0
赔礼道歉 0.0
赞叹 0.0
踏实 0.1421248473147575
这件 0.0
连连 0.0
道口 0.0
金山 0.0
降职 0.0
风生水 0.0

完成中文文本的挖掘工作,接下来就是建立分析模型了!回聊!

猜你喜欢

转载自blog.csdn.net/weixin_41599977/article/details/89408752
今日推荐