Python 机器学习 决策树 文本特征的处理
Python机器学习中,决策树是一种常用的分类和回归模型。决策树可以处理数值型特征和类别型特征。对于文本特征,决策树通常使用词袋模型 (BOW) 或 TF-IDF 模型进行处理。在处理文本特征时,决策树(和机器学习算法通常)不能直接处理原始文本。文本必须首先转换成算法能理解的数值形式。
参考文档:
1、文本预处理
在使用决策树等算法时,对文本数据进行有效的预处理是非常重要的。文本数据通常需要转换成模型能够理解的格式,这个过程涉及到一系列的文本预处理步骤。
1) 文本清洗
文本数据往往包含很多噪声信息,如标点符号、特殊字符、错误的拼写等,这些都可能影响模型的性能。文本清洗步骤可以包括去除HTML标签,移除特殊字符和标点符号,纠正拼写错误,转换为小写(有助于确保模型不会把同一个词的不同大小写视为不同的词)。
import string import nltk from nltk.corpus import stopwords from nltk.tokenize import word_tokenize from nltk.stem import PorterStemmer, WordNetLemmatizer # 下载nltk数据 nltk.download('punkt') nltk.download('stopwords') nltk.download('wordnet') nltk.download('omw-1.4') # 原始文本 text = "This is a Sample Text, showing off the stop words filtration and stemming!" # 转换为小写 text_lower = text.lower() # 去除标点符号 translator = str.maketrans('', '', string.punctuation) text_no_punctuation = text_lower.translate(translator) # 去除停用词 stop_words = set(stopwords.words('english')) word_tokens = word_tokenize(text_no_punctuation) filtered_text = [word for word in word_tokens if not word in stop_words] # 词干提取 ps = PorterStemmer() stemmed_words = [ps.stem(word) for word in filtered_text] # 词形还原 lemmatizer = WordNetLemmatizer() lemmatized_words = [lemmatizer.lemmatize(word) for word in stemmed_words] # 组合处理后的文本 processed_text = ' '.join(lemmatized_words) print("Original Text:", text) print("Processed Text:", processed_text)
2)分词(Tokenization)
分词是将连续的文本分割成一个个单独的词语或标记的过程。文本数据通常需要被转换成模型可以理解的数值型数据。分词(Tokenization)是文本预处理中的一个重要环节,它涉及将文本分解成更小的部分(如单词、短语或其他符号),以便进一步处理和分析。
from sklearn.feature_extraction.text import CountVectorizer # 示例文本 texts = ["Python is a powerful programming language.", "Machine learning with Python is fun and exciting."] # 初始化CountVectorizer vectorizer = CountVectorizer() # 拟合数据并转换为数值型特征 X = vectorizer.fit_transform(texts) # 查看分词结果 print(vectorizer.get_feature_names_out()) # 查看数值型特征 print(X.toarray())
2、特征提取
将原始文本转换为模型可以理解的格式,通常是数值型特征向量。最常用的方法是词袋模型(Bag of Words, BoW)和TF-IDF(Term Frequency-Inverse Document Frequency)。
1)词袋模型(Bag of Words, BoW)
词袋模型(Bag of Words, BoW)是一种简单而强大的文本特征提取方法,它将文本转换为固定长度的数值向量。BoW模型忽略了文本中词语的顺序和语法,只考虑词汇出现的频率。将文本转换为词频向量。在这种表示法中,每个文档表示为一个长向量,向量的每个元素对应词汇表中的一个词,并且每个元素的值是该词在文档中出现的次数。
from sklearn.feature_extraction.text import CountVectorizer # 示例文本数据 corpus = [ 'Text of the first document.', 'Text of the second second document.', 'And the third one.', 'Is this the first document?' ] # 初始化CountVectorizer vectorizer = CountVectorizer() # 将文本数据转换为词频矩阵 X = vectorizer.fit_transform(corpus) # 获取词汇表 print(vectorizer.get_feature_names_out()) # 查看文本数据的词频矩阵 print(X.toarray())
2)TF-IDF(Term Frequency-Inverse Document Frequency)
在自然语言处理(NLP)领域,处理文本数据是一个常见的任务。文本数据通常需要通过预处理和特征提取转换成模型可以理解的格式。TF-IDF(Term Frequency-Inverse Document Frequency,词频-逆文档频率)是一种常用的特征提取方法,用于将文本转换为数值向量,以便于使用机器学习算法。TF-IDF 是一种统计方法,用于评估一个词语对于一个文档集或一个语料库中的其中一份文档的重要程度。它的值反映了词语在文档中的重要性,这个重要性随着词语在文档中出现的次数线性增加,但同时会被词语在语料库中的出现频率所抵消。
from sklearn.feature_extraction.text import TfidfVectorizer # 示例文档 documents = [ 'The sky is blue.', 'The sun is bright today.', 'The sun in the sky is bright.', 'We can see the shining sun, the bright sun.' ] # 初始化TF-IDF Vectorizer vectorizer = TfidfVectorizer() # 使用TF-IDF vectorizer拟合并转换文档 tfidf_matrix = vectorizer.fit_transform(documents) # 查看结果 print(tfidf_matrix.toarray()) # 获取特征名 print(vectorizer.get_feature_names_out())
3、使用决策树模型
文本被转换为数值特征,则可以使用这些特征来训练决策树模型。决策树将使用这些特征来学习如何将文档分类或预测目标变量。
from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.tree import DecisionTreeClassifier # 准备数据 texts = ["今天天气真好", "机器学习很有趣", "决策树是一种有用的模型", "今天天气很差", "我不喜欢今天的天气"] labels = [1, 2, 2, 1, 1] # 1代表关于天气的文本,2代表关于机器学习的文本 # 文本向量化 vectorizer = TfidfVectorizer() X = vectorizer.fit_transform(texts) # 训练决策树模型 clf = DecisionTreeClassifier() clf.fit(X, labels) # 进行预测 new_texts = ["决策树可以用于分类问题", "明天天气怎么样"] new_X = vectorizer.transform(new_texts) predictions = clf.predict(new_X) # 打印预测结果 print(predictions) # 具体结果依赖于模型训练
参考文档: