代码之家  ›  专栏  ›  技术社区  ›  Felipe

为什么scikit不能正确地学习tokenizer来标记utf-8(葡萄牙语)文本?

  •  0
  • Felipe  · 技术社区  · 5 年前

    这是一些文本,只有两个字符串:

    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”一词,它删除了无法理解的字符):

    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 回复  |  直到 5 年前
        1
  •  1
  •   willeM_ Van Onsem    5 年前

    这个 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']]
    

    但我不太熟悉有很多变音符号的语言来测试这是否适用于所有可能的组合变音符号。