当前位置:   article > 正文

【NLP自然语言处理】文本特征提取_文本特征提取算法

文本特征提取算法

目录

1、文本表示方法:

2、Count Vecotrs(Bag of Words词袋模型)

3、TF-IDF模型

3.1 jieba

下载结巴 :

使用结巴进行分词 

 3.2TF-IDF提取文本特征实例


1、文本表示方法:

  • One-hot
  • Bag of Words
  • N-gram

N-gram与Count Vectors类似,加入了相邻单词组合成为新的单词,并进行计数。

  • TF-IDF

这几种文本表示方法存在的缺陷:转换得到的向量维度很高,需要较长的训练实践;没有考虑单词与单词之间的关系,只是进行了统计。 

2、Count Vecotrs(Bag of Words词袋模型

词向量之词袋模型(BOW)详解

sklearn——CountVectorizer详

from sklearn.feature_extraction.text import CountVectorizer

  1. #CountVectors+RidgeClassifier
  2. import pandas as pd
  3. from sklearn.feature_extraction.text import CountVectorizer
  4. from sklearn.linear_model import RidgeClassifier
  5. from sklearn.metrics import f1_score
  6. from sklearn.model_selection import train_test_split
  7. df = pd.read_csv('新建文件夹/天池—新闻文本分类/train_set.csv', sep='\t',nrows = 15000)
  8. ##统计每个字出现的次数,并赋值为0/1 用词袋表示text(特征集)
  9. ##max_features=3000文档中出现频率最多的前3000个词
  10. #ngram_range(1,3)(单个字,两个字,三个字 都会统计
  11. vectorizer = CountVectorizer(max_features = 3000,ngram_range=(1,3))
  12. train_text = vectorizer.fit_transform(train_df['text'])
  13. X_train,X_val,y_train,y_val = train_test_split(train_text,df.label,test_size = 0.3)
  14. #岭回归拟合训练集(包含text 和 label)
  15. clf = RidgeClassifier()
  16. clf.fit(X_train,y_train)
  17. val_pred = clf.predict(X_test)
  18. print(f1_score(y_val,val_pred,average = 'macro'))

3、TF-IDF模型

TF-IDF 分数由两部分组成:第一部分是词语频率(Term Frequency),第二部分是逆文档频率(Inverse Document Frequency)。其中计算语料库中文档总数除以含有该词语的文档数量,然后再取对数就是逆文档频率。

  • TF(t)= 该词语在当前文档出现的次数 / 当前文档中词语的总数
  • IDF(t)= log_e(文档总数 / 出现该词语的文档总数)

当有TF(词频)和IDF(逆文档频率)后,将这两个词相乘,就能得到一个词的TF-IDF的值。某个词在文章中的TF-IDF越大,那么一般而言这个词在这篇文章的重要性会越高,所以通过计算文章中各个词的TF-IDF,由大到小排序,排在最前面的几个词,就是该文章的关键词。

from sklearn.feature_extraction.text import TfidfVectorizer

  1. from sklearn.feature_extraction.text import TfidfVectorizer
  2. import numpy as np
  3. corpus = [
  4. 'This is the first document.',
  5. 'This document is the second document.',
  6. 'And this is the third one.',
  7. 'Is this the first document?',
  8. ]
  9. vectorizer = TfidfVectorizer()
  10. X = vectorizer.fit_transform(corpus)# 得到tf-idf矩阵,稀疏矩阵表示法
  11. vectorizer.get_feature_names()
  12. X.toarray()
  13. #最后to_array()函数返回的是每个文档中关键词的tf-idf值
  14. #将每个文档的toptf-idf值输出
  15. word = vectorizer.get_feature_names()
  16. #['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']
  17. weight = X.toarray()
  18. for i in range(len(weight)):
  19. w_sort = np.argsort(-weight[i])
  20. print('doc: {0}, top tf-idf is : {1},{2}'.format(corpus[i], word[w_sort[0]], weight[i][w_sort[0]]) )
  1. from sklearn.feature_extraction.text import TfidfVectorizer
  2. document = ["I have a pen.",
  3. "I have an apple."]
  4. tfidf_model = TfidfVectorizer().fit(document)
  5. sparse_result = tfidf_model.transform(document) # 得到tf-idf矩阵,稀疏矩阵表示法
  6. word = tfidf_model.get_feature_names()
  7. word
  8. # ['an', 'apple', 'have', 'pen']
  9. print(sparse_result) # 第0个字符串,对应词典序号为3的词的TFIDF为0.8148
  10. # 词语与列的对应关系
  11. # '''
  12. # (0, 3) 0.8148024746671689
  13. # (0, 2) 0.5797386715376657
  14. # (1, 2) 0.4494364165239821
  15. # (1, 1) 0.6316672017376245
  16. # (1, 0) 0.6316672017376245
  17. # '''

3.1 jieba

 TF-IDF在用之前,要经过分词处理,使用工具jieba进行分词

下载结巴 :

直接在jupyter notebook 代码栏中下载

pip install jieba

使用结巴进行分词 

  1. import jieba
  2. text = """我是一条天狗呀!
  3. 我把月来吞了,
  4. 我把日来吞了,
  5. 我把一切的星球来吞了,
  6. 我把全宇宙来吞了。
  7. 我便是我了!"""
  8. sentences = text.split()
  9. sent_words = [list(jieba.cut(sen0)) for sen0 in sentences ]
  10. document= [' '.join(sen0) for sen0 in sent_words]
  11. print(document)
  12. # ['我 是 一条 天狗 呀 !', '我 把 月 来 吞 了 ,', '我 把 日来 吞 了 ,', '我 把 一切 的 星球 来 吞 了 ,
  13. # ', '我 把 全宇宙 来 吞 了 。', '我 便是 我 了 !']
  14. model = TfidfVectorizer().fit(document)
  15. print(model.vocabulary_)
  16. # {'一条': 1, '天狗': 4, '日来': 5, '一切': 0, '星球': 6, '全宇宙': 3, '便是': 2}
  17. sparse_result = model.transform(document)
  18. print(sparse_result)
  19. '''
  20. (0, 4) 0.7071067811865476
  21. (0, 1) 0.7071067811865476
  22. (2, 5) 1.0
  23. (3, 6) 0.7071067811865476
  24. (3, 0) 0.7071067811865476
  25. (4, 3) 1.0
  26. (5, 2) 1.0'''

 3.2TF-IDF提取文本特征实例

  1. #TF-IDF + RidgeClassifier
  2. import pandas as pd
  3. from sklearn.feature_extraction.text import TfidfVectorizer
  4. from sklearn.linear_model import RidgeClassifier
  5. from sklearn.metrics import f1_score
  6. df = pd.read_csv('新建文件夹/天池—新闻文本分类/train_set.csv', sep='\t',nrows = 15000)
  7. train_test = TfidfVectorizer(ngram_range=(1,3),max_features = 3000).fit_transform(df.text)
  8. X_train,X_val,y_train,y_val = train_test_split(train_text,df.label,test_size = 0.3)
  9. clf = RidgeClassifier()
  10. clf.fit(X_train,y_train)
  11. val_pred = clf.predict(X_test)
  12. print(f1_score(y_val,val_pred,average = 'macro'))
  • 这两个模型一般与机器学习模型一起使用,前者负责提取文本中的特征,机器学习模型负责预测和分类

CountVectorizer TfidfVectorizer 中文处理

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/635061
推荐阅读
相关标签
  

闽ICP备14008679号