我正在尝试使用 TFIDF 和 SVM 对某些文件进行文本分类。每次选择 3 个词的功能。我的数据文件已经是这样的格式:angel eyes has, each one for, on its own. 没有停用词,也不能进行旅鼠或词干提取。我希望该功能被选择为:angel eyes has ...我编写的代码如下:
import os
import sys
import numpy
from sklearn.svm import LinearSVC
from sklearn.metrics import confusion_matrix
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn import metrics
from sklearn.datasets import load_files
from sklearn.cross_validation import train_test_split
dt=load_files('C:/test4',load_content=True)
d= len(dt)
print dt.target_names
X, y = dt.data, dt.target
print y
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
print y_train …Run Code Online (Sandbox Code Playgroud) 我有一个包含医学文本数据的数据集,我对它们应用 tf-idf 矢量器并计算单词的 tf idf 分数,如下所示:
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer as tf
vect = tf(min_df=60,stop_words='english')
dtm = vect.fit_transform(df)
l=vect.get_feature_names()
x=pd.DataFrame(dtm.toarray(), columns=vect.get_feature_names())
Run Code Online (Sandbox Code Playgroud)
所以基本上我的问题如下 - 当我应用 TfidfVectorizer 时,它会将文本分割成不同的单词,例如:“疼痛”、“头痛”、“恶心”等。如何获得 TfidfVectorizer 输出中的单词组合,例如:“剧烈疼痛”、“丛集性头痛”、“恶心呕吐”。谢谢
以下是我的代码:
sklearn_tfidf = TfidfVectorizer(ngram_range= (3,3),stop_words=stopwordslist, norm='l2',min_df=0, use_idf=True, smooth_idf=False, sublinear_tf=True)
sklearn_representation = sklearn_tfidf.fit_transform(documents)
Run Code Online (Sandbox Code Playgroud)
它通过删除所有停用词来生成三元组。
我希望它允许那些中间有停用词的 TRIGRAM(不在开始和结束处)
是否需要为此编写处理器。需要建议。
我正在尝试为文本多分类引入 LightGBM。pandas 数据框中的 2 列,其中“类别”和“内容”设置如下。
数据框:
contents category
1 this is example1... A
2 this is example2... B
3 this is example3... C
*Actual data frame consists of approx 600 rows and 2 columns.
Run Code Online (Sandbox Code Playgroud)
在此,我尝试将文本分为以下 3 类。
代码:
import pandas as pd
import numpy as np
from nltk.corpus import stopwords
stopwords1 = set(stopwords.words('english'))
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer, TfidfVectorizer
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV
import lightgbm as lgbm
from lightgbm import LGBMClassifier, LGBMRegressor
#--main code--# …Run Code Online (Sandbox Code Playgroud) 如何在用于交叉验证的 sklearn 管道内让 TFIDF Vectorizer 返回具有相应列名的 Pandas 数据帧?
我有一个 Sklearn 管道,其中一个步骤是一个 TFIDF 向量化器:
class InspectPipeline(BaseEstimator, TransformerMixin):
def transform(self, x):
return x
def fit(self, x, y=None):
self.df = x
return self
pipeline = Pipeline(
[
("selector", ItemSelector(key="text_column")),
("vectorizer", TfidfVectorizer()),
("debug", InspectPipeline()),
("classifier", RandomForestClassifier())
]
)
Run Code Online (Sandbox Code Playgroud)
我创建了这个类InspectPipeline,以便稍后检查传递给分类器的特征是什么(通过运行pipeline.best_estimator_.named_steps['debug'].df)。但是, TfidfVectorizer 返回一个稀疏矩阵,这是我在执行时得到的pipeline.best_estimator_.named_steps['debug'].df。我想将 TFIDF 向量作为 Pandas 数据帧,而不是获得稀疏矩阵,其中列名是各自的 tfidf 标记。
我知道这tfidf_vectorizer.get_feature_names()有助于了解列名。但是如何在管道中包含这个 + 将稀疏矩阵转换为数据帧?
我正在尝试获取每个文档中 TF-IDF 得分最高的 10 个单词。
我的数据框中有一列包含来自我的各种文档的预处理文本(没有标点符号、停用词等)。在此示例中,一行表示一个文档。
它有 500 多行,我很好奇每行中最重要的单词。
所以我运行了以下代码:
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer()
vectors = vectorizer.fit_transform(df['liststring'])
feature_names = vectorizer.get_feature_names()
dense = vectors.todense()
denselist = dense.tolist()
df2 = pd.DataFrame(denselist, columns=feature_names)
Run Code Online (Sandbox Code Playgroud)
这给了我一个 TF-IDF 矩阵:
我的问题是,如何收集 TF-IDF 值最高的前 10 个单词?最好在我的原始数据框 (df) 中创建一个列,其中包含每行的前 10 个单词,同时还知道哪些单词总体上最重要。
这是一个关于ngrams线性回归的问题,使用Tf-IDF(术语频率 - 逆文档频率).为此,我使用numpy稀疏矩阵和sklearn进行线性回归.
使用unigrams时我有53个病例和超过6000个功能.预测基于使用LeaveOneOut的交叉验证.
当我创建一个只有unigram分数的tf-idf稀疏矩阵时,我得到的预测比我创建unigram + bigram分数的tf-idf稀疏矩阵要好一些.我添加到矩阵的列越多(三元组,四元组,五元组等的列),回归预测的准确性就越低.
这是常见的吗?这怎么可能?我会认为功能越多越好.
我具有弹性搜索节点的默认配置:5个分片和1个副本。我查询在特定字段上匹配的节点,这对于这5个分片中的许多文档都是相同的。但是,由于该特定分片中该文档的查询的tf-idf,搜索结果的得分不同。对我而言,理想的情况是在不同分片的相同字段中为文档获得相同的分数,并且我可以通过订购对我来说很重要的第二条标准来打破关系。如何做到这一点?
我有100个文档(每个文档都是该文档中的一个简单的单词列表).现在我想创建一个TF-IDF矩阵,这样我就可以按等级创建一个小词搜索.我使用tfidfVectorizer尝试了它,但在语法中丢失了.任何帮助将非常感激.问候.
编辑:我将列表转换为字符串并将其添加到父列表中:
vectorizer = TfidfVectorizer(vocabulary=word_set)
matrix = vectorizer.fit_transform(doc_strings)
print(matrix)
Run Code Online (Sandbox Code Playgroud)
这里word_set是可能的不同单词的集合,doc_strings是一个包含每个文档作为字符串的列表; 但是,当我打印矩阵时,我得到如下输出:
(0, 839) 0.299458532286
(0, 710) 0.420878518454
(0, 666) 0.210439259227
(0, 646) 0.149729266143
(0, 550) 0.210439259227
(0, 549) 0.210439259227
(0, 508) 0.210439259227
(0, 492) 0.149729266143
(0, 479) 0.149729266143
(0, 425) 0.149729266143
(0, 401) 0.210439259227
(0, 332) 0.210439259227
(0, 310) 0.210439259227
(0, 253) 0.149729266143
(0, 216) 0.210439259227
(0, 176) 0.149729266143
(0, 122) 0.149729266143
(0, 119) 0.210439259227
(0, 111) 0.149729266143
(0, 46) 0.210439259227
(0, 26) 0.210439259227
(0, 11) 0.149729266143
(0, 0) …Run Code Online (Sandbox Code Playgroud) 我正在进行文本分析,我想忽略那些只是数字的"单词".例如.从文本"这是000斯巴达!" 只应使用'this','is'和'Sparta'这两个词.有没有办法做到这一点?怎么样?
tf-idf ×10
scikit-learn ×7
python ×6
nlp ×2
pandas ×2
lightgbm ×1
matrix ×1
python-3.x ×1
regression ×1
sharding ×1
statistics ×1