scikit为什么不能正确学习令牌生成器对utf-8(葡萄牙语)文本进行令牌化?

时间:2019-06-29 23:00:43

标签: python python-3.x encoding utf-8 scikit-learn

这是一些文本,在numpy ndarray中只有两个字符串:

titles
>>> array(['"a onda": como a psicologia social pode explicar a ação dos grupos?',
       '"beba menos mas beba melhor": entenda o lema da cerveja artesanal'],
      dtype=object)

我期望sklearn的CountVectorizer中的向量化器可以正确分割单词,但似乎并没有(请注意,它未能对单词“ação”进行标记化,它删除了无法理解的字符):< / p>

cv=CountVectorizer()
cv.fit(titles)

tokenizer = cv.build_tokenizer()
[tokenizer(s) for s in titles]

[['onda',
  'como',
  'psicologia',
  'social',
  'pode',
  'explicar',
  'ac', ## <<<< sklearn failed to identify the word "ação"
  'dos',
  'grupos'],
 ['beba',
  'menos',
  'mas',
  'beba',
  'melhor',
  'entenda',
  'lema',
  'da',
  'cerveja',
  'artesanal']]

我正在使用sklearn版本 0.21.2 和Python版本 3.6.7

1 个答案:

答案 0 :(得分:1)

CountVectorizer [scikit-doc]使用 token_pattern 参数,默认情况下为(?u)\b\w\w+\b

不幸的是,\w现在not capture combining diacritics。但是,可能有一个 。我们可以改为传递以下正则表达式:

cv = CountVectorizer(token_pattern=r'\b(?:[^\s]){2,}\b')

这似乎适用于您输入的内容:

>>> [tokenizer(s) for s in data]
[['onda',
  'como',
  'psicologia',
  'social',
  'pode',
  'explicar',
  'ação',
  'dos',
  'grupos'],
 ['beba',
  'menos',
  'mas',
  'beba',
  'melhor',
  'entenda',
  'lema',
  'da',
  'cerveja',
  'artesanal']]

但是我对带有许多变音符号的语言不太熟悉,无法测试这是否适用于所有可能的变音符号。