如何从文本语料库中删除特定的单字组,但仍保留该单词的双字组?

问题描述 投票:0回答:1

我有这样的情况,我必须从文本语料库中删除特定单词unigram,同时保持该单词的双字符以及该单词的单词。

我试图将文本地址数据(excel中的列)与其他一些数字特征一起传递给分类算法。我需要对文本数据进行countvectorize并过滤掉特定的uni-gram并将它们附加回数据帧,以便分类器算法能够理解它。

** sample data in Text Column**

TAJ MAHAL
TAJ MALABAR KOCHI
TAJ MALABAR KOCHI
TAJ  RESIDENCY  TVM
LEELA PALACE  
PALACE  ROAD
HILL VIEW ROAD
HILL  AVENUE
HILL STATION

对于Taj和Hill,我只想要Bigrams和trigrams,所有单词我想要unigram,bigrams和trigrams。

**输出BIGRAM和UNIGRAM **

TAJ MAHAL
TAJ MALABAR 
MALABAR KOCHI
TAJ  RESIDENCY 
KOCHI
LEELA 
PALACE  
LEELA PALACE  
PALACE  ROAD
HILL VIEW
HILL  AVENUE
HILL STATION

当我尝试使用停用词作为Taj和Hill时,也不会生成bigrams和trigrams

  cv = CountVectorizer( max_features = 200,analyzer='word',ngram_range=(1, 3))
    cv_txt = cv.fit_transform(data.pop('Txt'))
   for i, col in enumerate(cv.get_feature_names()):
    data[col] = pd.SparseSeries(cv_txt[:, i].toarray().ravel(), fill_value=0)

过滤掉特定的unigrams后,我想将它们附加到数据帧,以便我可以运行分类算法。最终输出是计数器文本数据的稀疏矩阵

pandas scikit-learn nlp nltk n-gram
1个回答
2
投票

如果您只想删除特定的unigrams,则必须使用掩码从转换后的数据中删除它们。如果这将用于比一次性分析更复杂的任何事情,我建议编写一个包装类来管理它,否则将很难跟踪。

from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd

X = """TAJ MAHAL
TAJ MALABAR KOCHI
TAJ MALABAR KOCHI
TAJ  RESIDENCY  TVM
LEELA PALACE  
PALACE  ROAD
HILL VIEW ROAD
HILL  AVENUE
HILL STATION"""
X = X.split('\n')
df = pd.DataFrame(dict(txt=X))

cv = CountVectorizer(max_features = 200, analyzer='word', ngram_range=(1, 3))
cv.fit(df.txt)
feat_name = cv.get_feature_names()

#List of unigrams to remove (will work for ngrams too)
remove_list = ['taj', 'hill']

# This is the mask of features you want to keep
keep_mask = ~np.in1d(feat_name, remove_list)

# before the mask
X_transformed = cv.transform(df.txt)
print(X_transformed.shape)

# after the mask
X_transformed = X_transformed[:, keep_mask]
print(X_transformed.shape)

编辑更新的问题

# code to do the pandas merge
feat_name = np.array(feat_name)[keep_mask]
df_2 = pd.SparseDataFrame(data=X_transformed,
                          columns=feat_name,
                          default_fill_value=0)
df_merge = df.merge(df_2, left_index=True, right_index=True)

输出:

(9, 13)
(9, 11)

要在一个整洁的数据框架中得到这个,只需一个

© www.soinside.com 2019 - 2024. All rights reserved.