机器学习笔记---文本特征提取与模型复用

1.词袋模型

1.1 理解词袋模型

所谓词袋模型就是,首先将训练样本中所有不重复的词放到这个袋子中构成一个词表(字典);然后再以这个词表为标准来遍历每一个样本,如果词表中对应位置的词出现在了样本中,那么词表对应位置就用1来表示,没有出现就用0来表示;最后,对于每个样本来说都将其向量化成了一个和词表长度一样的只含有0和1的向量。

具体的实现步骤:

  • 文本分词:将原始数据的每个样本都进行分词处理,(英文语料可以跳过这步)
  • 构造词表:在所有的分词结果中去掉重复的部分,保证每个词语只出现一次,且同时要以任意一种顺序来固定词表中每个词的位置。
  • 文本向量化:遍历每个数据样本,若词表中的词出现在该样本中,则对应位置为1,没出现则为0。(维度灾难:在分词结束后通常还会进行词频统计这一步,即统计每个词在数据集中出现的次数,然后只选择其中出现频率最高的前K个词作为最终的词表。最后,通常也会将一些无意义的虚词,即停用词(Stop Words)去掉,例如“的,啊,了,”等。)

1.1.1 文本分词 

pip install jieba

普通分词模式:

 import jieba,re
 def cutWords(s, cut_all=False):
     cut_words = []
     s = re.sub("[A-Za-z0-9\:\·\—\,\。\“ \”]", "", s)
     seg_list = jieba.cut(s, cut_all=cut_all)
     cut_words.append(" ".join(seg_list))
     print(cut_words)

全分词模式:当把上面代码中cut_all=True后,便可以开启全分词模式,

1.1.2 构造词表

分词后通常还会先进行词频统计,以选取出现频率最高的前K个词来构造词表。对词频统计需要用到另外一个包collection中的Counter计数器。

def wordsCount(s):
     cut_words = ""
     s = re.sub("[A-Za-z0-9\:\·\—\,\。\“ \”]", "", s)
     seg_list = jieba.cut(s, cut_all=False)
     cut_words += (" ".join(seg_list))
     all_words = cut_words.split()   #对文本进行分词处理
     #词频统计
     c = Counter()
     for x in all_words:
         if len(x) > 1 and x != '\r\n':
             c[x] += 1
      
     #构建词表

     vocab = []
     print('\n词频统计结果:')
     for (k, v) in c.most_common(5):  # 输出词频最高的前5个词
         print("%s:%d" % (k, v))
         vocab.append(k)
     print("词表:", vocab)

1.1.3 文本向量化

向量化工作则是遍历每个样本,查看词表中每个词是否出现在当前样本中,如果出现则词表对应维度用1表示,没出现用0表示。

 def vetorization(s):
         # #此处接文本分词和词频统计代码
     x_vec = []  #
     for item in x_text:   #表示原始文本分词后的结果
         tmp = [0] * len(vocab)  #tmp表示先初始化一个长度为词表长度的全0向量
         #遍历每一句文本中的每一个词,判断其是否存在于词表中,如果存在则将tmp向量对应处置为1
         for i, w in enumerate(vocab):
             if w in item:
                 tmp[i] = 1
         x_vec.append(tmp)
     print("词表:", vocab)
     print("文本:", x_text)
     print(x_vec)

根据vetorization函数便能够对输入的文本进行向量化表示。

 s=['文本分词工具可用于对文本进行分词处理','常见的用于处理文本的分词处理工具有很多']
 vetorization(s)
 词表: ['文本', '分词', '处理', '工具', '用于', '进行', '常见', '很多']
 文本:[['文本','分词','工具','可','用于', '对','文本','进行', '分词', '处理'], ['常见', '的', '用于', '处理', '文本', '的', '分词', '处理', '工具', '有','很多']]
 [[1, 1, 1, 1, 1, 1, 0, 0], [1, 1, 1, 1, 1, 0, 1, 1]]

但是,这样做的弊端之一就是没有考虑到词的出现频率,即不管一个词出现了多少次,最后都仅仅用1来表示其出现过。

考虑词频的文本向量化

 def vectorization_with_freq(s):
         #此处接文本分词和词频统计代码
        x_vec = []
        for item in x_text:
        tmp = dict(zip(vocab, [0] * len(vocab)))
        for w in item:
             if w in vocab:
                 tmp[w] += 1
         x_vec.append(list(tmp.values()))
     print("词表:", vocab)
    print("文本:", x_text)
     print(x_vec)

根据vetorization_with_freq函数便能够对输入的文本进行向量化表示,

 s =['文本分词工具可用于对文本进行分词处理', '常见的用于处理文本的分词处理工具有很多']
 vectorization_with_freq(s)
 词表: ['文本', '分词', '处理', '工具', '用于', '进行', '常见', '很多']
 文本: [['文本', '分词', '工具', '可', '用于', '对', '文本', '进行', '分词', '处理'], ['常见','的','用于', '处理','文本','的','分词','处理','工具','有','很多']]
 [[2, 2, 1, 1, 1, 1, 0, 0], [1, 1, 2, 1, 1, 0, 1, 1]]
 from sklearn.feature_extraction.text import CountVectorizer
 count_vec = CountVectorizer(max_features=8, token_pattern=r"(?u)\b\w\w+\b")
 x = count_vec.fit_transform(s).toarray()
 vocab = count_vec.vocabulary_
 vocab = sorted(vocab.items(), key=lambda x: x[1])
 print(vocab)
 print(x)

2.考虑权重的词袋模型

2.1 TF-IDF模型

F-IDF为词频-逆文档频率(Term Frequence - Inverse Document Frequence)的简称。首先需要明白的是TF-IDF实际上是TF与IDF两者的乘积。同时,出现TF-IDF的原因在于,通常来说在一个样本中一次词出现的频率越高,其重要性应该对应越高,即考虑到词频对文本向量的影响;但是如果仅仅只是考虑到这一个因素则同样会带来一个新的弊端,即有的词不只是在某个样本中出现的频率高,其实它在整个数据集中的出现频率都很高,而这样的词往往也是没有意义的。因此,TF-IDF的做法是通过词的逆文档频率来加以修正调整。

2.2 TF-IDF计算原理

TF-IDF的计算过程总体上可以分为两步,先统计词频,然后计算逆文档频率,最后将两者相乘得到TF-IDF值。

案例

 四个样本:

1 corpus = ['this is the first document',
2           'this document is the second document',
3           'and this is the third one',
4           'is this the first document']

对应的词表:

1 vocabulary = ['this', 'document', 'first', 'is', 'second', 'the',
2               'and', 'one']
 1 from sklearn.feature_extraction.text import TfidfTransformer
 2 from sklearn.feature_extraction.text import CountVectorizer
 3 
 4 if __name__ == '__main__':
 5     count = CountVectorizer(vocabulary=vocabulary)
 6     count_matrix = count.fit_transform(corpus).toarray()
 7     tfidf_trans = TfidfTransformer(norm=None)
 8     tfidf_matrix = tfidf_trans.fit_transform(count_matrix)
 9     idf_vec = tfidf_trans.idf_
10     print(tfidf_matrix.toarray())

3.词云图

载入原始文本

 1 def load_data_and_cut(file_path='./data/QuanSongCi.txt'):
 2     cut_words = ""
 3     with open(file_path, encoding='utf-8') as f:
 4         for line in f:
 5             line = line.strip('\n')
 6             if len(line) < 20:
 7                 continue
 8             seg_list = jieba.cut(clean_str(line), cut_all=False)
 9             cut_words += (" ".join(seg_list))
10         all_words = cut_words.split()
11     return all_words

统计词频:

1 def get_words_freq(all_words, top_k=500):
2     c = Counter()
3     for x in all_words:
4         if len(x) > 1 and x != '\r\n':
5             c[x] += 1
6     vocab = {}
7     for (k, v) in c.most_common(top_k):
8         vocab[k] = v
9     return vocab

生成词云图:
 

1 def show_word_cloud(word_fre):
2     word_cloud = WordCloud(font_path='./data/simhei.ttf',
3                            background_color='white', max_font_size=70)
4     word_cloud.fit_words(word_fre)
5     plt.imshow(word_cloud)
6     plt.xticks([])  # 去掉横坐标
7     plt.yticks([])  # 去掉纵坐标
8     plt.tight_layout()
9     plt.show()

自定义样式:

 1 def show_word_cloud(word_fre):
 2     from PIL import Image
 3     img = Image.open('./data/dufu.png')
 4     img_array = np.array(img)
 5     word_cloud = WordCloud(font_path='./data/simhei.ttf',
 6                            background_color='white', max_font_size=70, mask=img_array)
 7     word_cloud.fit_words(word_fre)
 8     plt.imshow(word_cloud)
 9     plt.xticks([])  # 去掉横坐标
10     plt.yticks([])  # 去掉纵坐标
11     plt.tight_layout()
12     plt.show()

本学习笔记来源于月来客栈

如有侵权,请联系删除!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 机器学习模型评估、选择和验证是指评估模型的性能、从多个模型中选择最佳模型,并验证模型的泛化能力。常用的评估方法包括准确率、精确率、召回率、F1 分数、ROC 曲线和 AUC 等。常用的选择方法包括交叉验证、超参数调优、学习曲线分析等。 ### 回答2: 机器学习的目标是通过训练来构建模型,以便能够高效地预测未知数据。但是,模型的准确性不仅取决于所使用的算法,还取决于其它因素,例如数据和参数设置。 模型评估能够帮助我们了解模型性能的好坏。评估算法的过程通常涉及到数据划分、交叉验证和各种评估指标。一般来说,数据划分的过程将数据集拆分成训练集和测试集。用训练集来构建模型并进行参数调整,然后使用测试集来衡量模型的性能。交叉验证是在数据集合上的一个更安全和更可靠的方法,它将原始数据集划分成K个互斥的子集,并使用K-1个子集来训练模型,用剩余的子集来评估模型的性能。 选择正确的模型非常关键,因为模型的性能可以直接影响结果的准确性。选择模型的一个重要因素是如何表示数据集。数据可以使用多种方式表示,而不同的数据表示方式有不同的优劣。选择适当的模型是当然的,但是我们还应该使用技术来优化模型,并防止模型过度拟合或欠拟合。 模型验证是评估模型如何执行任务的最终步骤。验证后,我们可以使用模型进行预测并将其应用于新数据。如果模型的性能不符合要求,可以通过重新评估、更改数据集或改变模型参数来尝试改善。模型验证是机器学习流程中非常重要的一部分,可以确保我们的模型效果良好,从而为我们提供可靠的预测结果。 总之,机器学习是一种建立复杂模型的方法,不同的算法、数据表示方式和参数会影响其性能。为了找到最佳模型,我们需要进行模型评估、选择和验证等工作。这些步骤是机器学习流程的关键组成部分,可以帮助我们构建高效且准确的模型,从而应对各种实际应用场景。 ### 回答3: 机器学习是一种人工智能领域的重要技术,它允许计算机从历史数据中学习,建立预测模型,并用于未来的数据预测和决策。模型评估、选择与验证是机器学习过程中的重要一环,以保证模型的准确性、稳定性和泛化能力。 模型评估的目的是检验模型的表现,并度量其优劣。常用的评估指标包括精确度、召回率、F1值等,这些指标可以用于比较不同模型之间的性能表现。评估模型时,通常需要将数据集划分为训练集和测试集,训练集用于训练模型,而测试集用于评估模型性能。评估模型的结果可以指导我们调整模型的参数,提高模型的预测精度。 模型选择是在多个模型中选择最合适的模型。常用的模型选择方法包括交叉验证、留一法等。交叉验证是将数据集分成k个子集,每个子集轮流作为测试集进行模型评估,其余部分用于训练模型,最后将测试集误差取平均值作为综合误差来评估模型的性能。 模型验证是对模型的泛化能力的验证。泛化能力是指模型对未知数据的预测精度,即模型是否能够对新数据进行较好的预测。在模型验证中,需要将数据集划分为训练集、验证集和测试集。在训练集中训练模型,在验证集上调整模型参数,并在测试集上验证模型的泛化能力。常用的验证方法包括留存法、k折交叉验证等。 综上所述,模型评估、选择与验证对于机器学习中的预测模型非常重要。这些技术可以保证模型的准确性和稳定性,并提高模型的泛化能力,为数据分析和预测提供可靠依据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值