基于词汇和正则表达式矢量化文档

Posted

技术标签:

【中文标题】基于词汇和正则表达式矢量化文档【英文标题】:Vectorize document based on vocabulary AND regex 【发布时间】:2020-08-03 04:04:01 【问题描述】:

我正在尝试使用 sklearn 的 CountVectorizer 训练文本分类器。问题是我的训练文档有许多特定于文档的标记。因此,例如,CountVectorizer.fit_transform 方法可以很好地处理常规的英语单词,但是有些标记的格式适合正则表达式:'\w\d\d\w\w\d',例如作为'd84ke2'。就像现在一样,fit_transform 方法只会将 'd84ke2' 当作一个特征来使用。

我希望能够使用与特定正则表达式匹配的特定标记作为自己的特征,并将常规英文单词作为自己的特征,因为创建诸如“d84ke2”之类的特征将没有用,因为这不会在任何其他文件中再次出现。

我还没有找到一种方法来做到这一点,更不用说“最好”的方法了。下面是我的代码示例,您可以在其中看到标记“j64ke2”、“r32kl4”、“w35kf9”和“e93mf9”都变成了它们自己的特征。为了清楚起见,我重复一遍:我想基本上将这些功能浓缩成一个并保留其他功能。

docs = ['the quick brown j64ke2 jumped over the lazy dogs r32kl4.', 
        'an apple a day keeps the w35kf9 away', 
        'you got the lions share of the e93mf9']

import numpy as np
# define target and target_names  
target_names = ['zero', 'one', 'two']
target = np.array([0, 1, 2])

# Create message bunch. 
from sklearn.utils import Bunch
doc_info = Bunch(data=docs, target=target, target_names=target_names)


# Vectorize training data
from sklearn.feature_extraction.text import CountVectorizer
count_vect = CountVectorizer()
count_vect.fit(doc_info.data)

vocab = count_vect.vocabulary_
vocab_keys = list(vocab.keys())
#vocab_vals = list(vocab.values())

X_train_counts = count_vect.transform(doc_info.data)
X = X_train_counts.toarray()        
import pandas as pd
df = pd.DataFrame(X, columns=vocab_keys)

【问题讨论】:

也许在使用 CountVectorizer 之前使用docs_clean = [re.sub("\w\d2\w2\d", 'j64ke2', i) for i in docs] 【参考方案1】:

yatu 的评论是一个很好的解决方案。通过为每个匹配的正则表达式替换一个单词,我能够在将文档提供给CountVectorizer 之前对其进行清理。

【讨论】:

以上是关于基于词汇和正则表达式矢量化文档的主要内容,如果未能解决你的问题,请参考以下文章

scikit-learn CountVectorizer 词汇表和正则表达式

正则表达式、组和量化器

正则表达式

python正则表达式

python正则表达式

Python正则表达式指南