【问题标题】:How remove specific unigram from the text corpus but still maintaining the Bi-grams of that word?如何从文本语料库中删除特定的 unigram 但仍保留该单词的 Bi-gram?
【发布时间】:2018-05-31 22:32:57
【问题描述】:

我有一种情况,我必须从文本语料库中删除特定单词的 unigram,同时保留该单词的二元组以及该单词的一元组。

我正在尝试将文本地址数据(excel 中的列)与其他一些数字特征一起传递给分类算法。我需要对文本数据进行计数向量化并过滤掉特定的 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 时,也不会生成二元组和三元组

  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)

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

【问题讨论】:

  • 使用ngram_range=(2,3)
  • @vivek-kumar 我猜 OP 想要删除特定的 unigrams 但一般保留 unigrams。
  • @ncfirth,正确。我还想在从 countvectorizer 过滤后将元素附加到数据框。

标签: pandas scikit-learn nlp nltk n-gram


【解决方案1】:

如果您只想删除特定的UNIGRAM,那么您必须使用掩码将它们从转换的数据中删除。如果这将被用在任何比一个脱离分析更复杂的任何复杂,我建议写一个包装类来管理它,否则会难以跟踪。

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)
要在一个neat dataframe中获得它,只是a

【讨论】:

  • 我想要将此返回到dataframe,这也可以为i,枚举中的col完成如何(cv.get_feature_names()):data [col] = pd.sparseseries(cv_addr [: ,i] .toarray()。ravel(),fill_value = 0) span>
  • 您可以编辑问题吗
  • 我已经用更多信息更新了问题,附加了一块我的代码 span>
  • 如果完全回答您的问题,您可以将答案标记为正确。 span>
猜你喜欢
  • 1970-01-01
  • 2017-04-17
  • 1970-01-01
  • 2019-11-12
  • 2020-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多