NLP: 词袋模型和TFIDF模型

文章目录


词袋模型

文本特征提取有两个非常重要的模型:

  • 词集模型:单词构成的集合,集合自然每个元素都只有一个,也即词集中的每个单词都只有一个。

  • 词袋模型:在词集的基础上如果一个单词在文档中出现不止一次,统计其出现的次数(频数)。

两者本质上的区别,词袋是在词集的基础上增加了频率的维度,词集只关注有和没有,词袋还要关注有几个。

假设我们要对一篇文章进行特征化,最常见的方式就是词袋。

导入相关的函数库:

复制代码
from sklearn.feature_extraction.text import CountVectorizer

实例化分词对象:

复制代码
vectorizer = CountVectorizer(min_df=1)
>>> vectorizer                    
    CountVectorizer(analyzer=...'word', binary=False, decode_error=...'strict',
            dtype=<... 'numpy.int64'>, encoding=...'utf-8', input=...'content',
            lowercase=True, max_df=1.0, max_features=None, min_df=1,
            ngram_range=(1, 1), preprocessor=None, stop_words=None,
            strip_accents=None, token_pattern=...'(?u)\\b\\w\\w+\\b',
            tokenizer=None, vocabulary=None)

将文本进行词袋处理:

复制代码
import jieba
from sklearn.feature_extraction.text import CountVectorizer

txt="""
变压器停、送电操作时,应先将该变压器中性点接地,对于调度要求不接地的变压器,在投入系统后应拉开中性点接地刀闸。
 在中性点直接接地系统中,运行中的变压器中性点接地闸刀需倒换时,应先合上另一台主变压器的中性点接地闸刀,再拉开原来变压器的中性点接地闸刀。运行中的变压器中性点接地方式、中性点倒换操作的原则是保证该网络不失去接地点,采用先合后拉的操作方法。
变压器中性点的接地方式变化后其保护应相应调整,即是变压器中性点接地运行时,投入中性点零序过流保护,停用中性点零序过压保护及间隔零序过流保护;变压器中性点不接地运行时,投入中性点零序过压保护及间隔零序保护,停用中性点零序过流保护,否则有可能造成保护误动作。
"""
words = jieba.lcut(txt)     # 使用精确模式对文本进行分词
vectorizer = CountVectorizer(min_df=1)#min_df 默认为1(int),表示"忽略少于1个文档中出现的术语",因此,默认设置不会忽略任何术语,该参数不起作用

X = vectorizer.fit_transform(words)

#获取对应的特征名称:
print(vectorizer.get_feature_names())#feature_names可能不等于words
#词袋化
print(X.toarray())

词袋类似array([[0, 1, 1, 1, 0, 0, 1, 0, 1],

0, 1, 0, 1, 0, 2, 1, 0, 1\], \[1, 0, 0, 0, 1, 0, 1, 1, 0\], \[0, 1, 1, 1, 0, 0, 1, 0, 1\]\]...)   但是如何可以使用现有的词袋的特征,对其他文本进行特征提取呢?我们定义词袋的特征空间叫做词汇表vocabulary: vocabulary=vectorizer.vocabulary_   针对其他文本进行词袋处理时,可以直接使用现有的词汇表: new_vectorizer = CountVectorizer(min_df=1, vocabulary=vocabulary)   CountVectorize函数比较重要的几个参数为: * decode_error,处理解码失败的方式,分为'strict'、'ignore'、'replace'三种方式。 * strip_accents,在预处理步骤中移除重音的方式。 * max_features,词袋特征个数的最大值。 * stop_words,判断word结束的方式。 * max_df,df最大值。 * min_df,df最小值 。 * binary,默认为False,当与TF-IDF结合使用时需要设置为True。 本例中处理的数据集均为英文,所以针对解码失败直接忽略,使用ignore方式,stop_words的方式使用english,strip_accents方式为ascii方式。 ## TF-IDF模型   文本处理领域还有一种特征提取方法,叫做TF-IDF模型(term frequency--inverse document frequency,词频与逆向文件频率)。TF-IDF是一种统计方法,用以评估某一字词对于一个文件集或一个语料库的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。 TF-IDF的主要思想是,如果某个词或短语在一篇文章中出现的频率TF(Term Frequency,词频),词频高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TF-IDF实际上是:TF \* IDF。TF表示词条在文档d中出现的频率。IDF(inverse document frequency,逆向文件频率)的主要思想是:如果包含词条t的文档越少,也就是n越小,IDF越大,则说明词条t具有很好的类别区分能力。如果某一类文档C中包含词条t的文档数为m,而其他类包含t的文档总数为k,显然所有包含t的文档数n=m+k,当m大的时候,n也大,按照IDF公式得到的IDF的值会小,就说明该词条t类别区分能力不强。但是实际上,如果一个词条在一个类的文档中频繁出现,则说明该词条能够很好代表这个类的文本的特征,这样的词条应该给它们赋予较高的权重,并选来作为该类文本的特征词以区别与其他类文档。 示例 文档 ![](https://i-blog.csdnimg.cn/direct/dd97f5e763a146ce9cdf99bcfeb0788e.png) 中文停用词见 [停用词](https://blog.csdn.net/kobeyu652453/article/details/106939559) import jieba import pandas as pd import re from sklearn.feature_extraction.text import CountVectorizer#词袋 from sklearn.feature_extraction.text import TfidfTransformer#tfidf file=pd.read_excel("文档.xls") # 定义删除除字母,数字,汉字以外的所有符号的函数 def remove_punctuation(line): line = str(line) if line.strip() == '': return '' rule = re.compile(u"[^a-zA-Z0-9\u4E00-\u9FA5]") line = rule.sub('', line) return line #停用词 def stopwordslist(filepath): try: stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()] except: stopwords = [line.strip() for line in open(filepath, 'r', encoding='gbk').readlines()] return stopwords # 加载停用词 stopwords = stopwordslist("停用词.txt") #去除标点符号 file['clean_review']=file['文档'].apply(remove_punctuation) # 去除停用词 file['cut_review'] = file['clean_review'].apply(lambda x: " ".join([w for w in list(jieba.cut(x)) if w not in stopwords])) #词袋计数 count_vect = CountVectorizer() X_train_counts = count_vect.fit_transform(file['cut_review']) #tf-idf tfidf_transformer = TfidfTransformer() X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts) X_train_tfidf (0, 123) 0.08779682150216786 表示第1篇文档词袋中第123个单词的tdidf为0.087 ![](https://i-blog.csdnimg.cn/direct/5ef1bd15dcf742018eec2e2d4239ba5e.png) X_train_tfidf.toarray() ![](https://i-blog.csdnimg.cn/direct/a6115ffc10564323af1e0852f4aeb8e5.png) ## 词汇表模型 词袋模型可以很好的表现文本由哪些单词组成,但是却无法表达出单词之间的前后关系,于是人们借鉴了词袋模型的思想,使用生成的词汇表对原有句子按照单词逐个进行编码。TensorFlow默认支持了这种模型: tf.contrib.learn.preprocessing.VocabularyProcessor ( max_document_length, min_frequency=0, vocabulary=None, tokenizer_fn=None) 其中各个参数的含义为: * max_document_length:,文档的最大长度。如果文本的长度大于最大长度,那么它会被剪切,反之则用0填充。 * min_frequency,词频的最小值,出现次数小于最小词频则不会被收录到词表中。 * vocabulary,CategoricalVocabulary 对象。 * tokenizer_fn,分词函数。 假设有如下句子需要处理: x_text =[ 'i love you', 'me too' ] 基于以上句子生成词汇表,并对'i me too'这句话进行编码: vocab_processor = learn.preprocessing.VocabularyProcessor(max_document_length) vocab_processor.fit(x_text) print next(vocab_processor.transform(['i me too'])).tolist() x = np.array(list(vocab_processor.fit_transform(x_text))) print x 运行程序,x_text使用词汇表编码后的数据为: \[\[1 2 3 0

4 5 0 0\]

'i me too'这句话编码的结果为:

1, 4, 5, 0

相关推荐
CM莫问2 小时前
<论文>(微软)避免推荐域外物品:基于LLM的受限生成式推荐
人工智能·算法·大模型·推荐算法·受限生成
康谋自动驾驶3 小时前
康谋分享 | 自动驾驶仿真进入“标准时代”:aiSim全面对接ASAM OpenX
人工智能·科技·算法·机器学习·自动驾驶·汽车
深蓝学院4 小时前
密西根大学新作——LightEMMA:自动驾驶中轻量级端到端多模态模型
人工智能·机器学习·自动驾驶
归去_来兮4 小时前
人工神经网络(ANN)模型
人工智能·机器学习·人工神经网络
2201_754918414 小时前
深入理解卷积神经网络:从基础原理到实战应用
人工智能·神经网络·cnn
强盛小灵通专卖员4 小时前
DL00219-基于深度学习的水稻病害检测系统含源码
人工智能·深度学习·水稻病害
Luke Ewin5 小时前
CentOS7.9部署FunASR实时语音识别接口 | 部署商用级别实时语音识别接口FunASR
人工智能·语音识别·实时语音识别·商用级别实时语音识别
Joern-Lee5 小时前
初探机器学习与深度学习
人工智能·深度学习·机器学习
云卓SKYDROID5 小时前
无人机数据处理与特征提取技术分析!
人工智能·科技·无人机·科普·云卓科技
R²AIN SUITE5 小时前
金融合规革命:R²AIN SUITE 如何重塑银行业务智能
大数据·人工智能