【问题标题】:How can I prevent words with hyphens from being tokenized when using scikit-learn`s term document matrix?使用 scikit-learn 的术语文档矩阵时,如何防止带有连字符的单词被标记?
【发布时间】: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”,这是我不想要的。有关如何解决此连字符问题的任何建议?

【问题讨论】:

  • 这个答案对您有帮助吗?

标签: python scikit-learn nlp term-document-matrix


【解决方案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  

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

【讨论】:

    猜你喜欢
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    相关资源
    最近更新 更多