使用 scikit-learn 的术语文档矩阵时,如何防止带有连字符的单词被标记?

Posted

技术标签:

【中文标题】使用 scikit-learn 的术语文档矩阵时,如何防止带有连字符的单词被标记?【英文标题】:How can I prevent words with hyphens from being tokenized when using scikit-learn`s term document matrix? 【发布时间】:2021-12-14 14:12:02 【问题描述】:

我目前正在处理大量文章(大约 205,000 篇),这需要构建术语文档矩阵。

我环顾四周,似乎 sklearn 提供了一种有效的构建方法。但是,当将建议的代码应用于一小部分文档(作为测试)时,我发现包含连字符的单词被分割,连字符作为分隔符。这是不可取的,因为我正在处理葡萄牙语文档,其中连字符很常见,因为有大量的复合名词。我想了解如何生成一个术语文档矩阵,该矩阵仅包含我的语料库的所有标记作为列,其中只有空格用作标记之间的分隔符(如果单词包含连字符,则应考虑作为单个令牌)。

代码如下:

index=['doc 1','doc 2','doc 3','doc 4']
docs=['como você está', 'guarda-chuva!','covid-19 piorou','teto-de-gastos do tesouro']

df = pd.DataFrame(list(zip(index, docs)))
df.columns = ['index', 'docs']

from sklearn.feature_extraction.text import CountVectorizer
vect = CountVectorizer()  
vects = vect.fit_transform(df.docs)
td = pd.DataFrame(vects.todense()).iloc[:len(df)]  
td.columns = vect.get_feature_names()
term_document_matrix = td.T
term_document_matrix.columns = ['Doc '+str(i) for i in range(1, len(df)+1)]
term_document_matrix['total_count'] = term_document_matrix.sum(axis=1)

打印矩阵时,我发现“teto-de-gastos”被转换为“teto”、“de”、“gastos”,这是我不想要的。有关如何解决此连字符问题的任何建议?

【问题讨论】:

这个答案对您有帮助吗? 【参考方案1】:

有一个参数可以让您在创建CountVectorizer 实例时覆盖标记器函数。您唯一应该想到的是实现所需的标记器。

vect = CountVectorizer(tokenizer=lambda document:document.strip().split()) 

输出:

   como  covid-19  do  está  guarda-chuva!  piorou  tesouro  teto-de-gastos  \
0     1         0   0     1              0       0        0               0   
1     0         0   0     0              1       0        0               0   
2     0         1   0     0              0       1        0               0   
3     0         0   1     0              0       0        1               1   

   você  
0     1  
1     0  
2     0  
3     0  

作为旁注,您应该非常小心地执行此操作并使用大量测试场景,以防止您尚未考虑的潜在主要部分出现意外行为:)

【讨论】:

以上是关于使用 scikit-learn 的术语文档矩阵时,如何防止带有连字符的单词被标记?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Scikit-learn 计算信息增益

这个矩阵或表格的名称是啥?

使用keras进行文本分类,我们可以直接训练文档术语矩阵吗?

文档术语矩阵的频率分布图

文本挖掘——如何构建术语-文档矩阵

将术语-文档矩阵限制为最常见的一元组