2017-09-19 8 views
1

J'extrais des données d'Oracle DB pour faire du text mining. Mes données sont UTF8 et le vocab ne peut pas le gérer.tokenisation d'une liste ne fonctionne pas avec UTF8

library(text2vec); 
library(DBI); 
Sys.setenv(TZ="+03:00"); 
drv=dbDriver("Oracle"); 
con=dbConnect(drv,username="user","pass",dbname="IP:port/servicename"); 

list=dbGetQuery(con,statement = "select * from test"); 

it_list = itoken(list$FNAME, 
        preprocessor = tolower, 
        tokenizer = word_tokenizer, 
        ids = list$ID, 
        progressbar = FALSE); 

vocab = create_vocabulary(it_list, ngram = c(ngram_min = 1L, ngram_max =2L)); 

mais juste un mot anglais existe en vocab.

  • liste objet variable existe dans ce link (peut être chargé avec load())
  • J'utilise les fenêtres
  • R.version:

plate-forme x86_64-w64-mingw32 arc x86_64
os mingw32
système x86_64, mingw32
état
majeur 3
mineur 3.0
année 2016
mois 05
jour 03
svn rev 70573
langue R
version.string Répartition Oracle de la version R 3.3.0 (2016-05- 03) pseudo Supposément éducatif

Répondre

1

Merci d'avoir signalé ce problème. C'est en fait un problème avec base::strsplit() qui est utilisé pour la tokenisation de base.

Je vous suggère d'utiliser stringi paquet pour regex avec un fort support UTF-8. Ou simplement utiliser tokenizers - bonne solution pour tokenization au-dessus de stringi.

Par exemple, vous pouvez utiliser tokenizers::tokenize_words en remplacement de word_tokenizer

tokenizers::tokenize_words("پوشاک بانک لي ") 
# "پوشاک" "بانک" "لي" 

drop-in Pour une raison quelconque base::strsplit() ne considère pas les thèses des symboles arabes comme "alphanumérique" ([[:alnum:]]).

strsplit("i was. there", "\\W") %>% lapply(function(x) x[nchar(x) > 0]) 
# "i"  "was" "there" 
strsplit("پوشاک بانک لي ", "\\W") %>% lapply(function(x) x[nchar(x) > 0]) 
# character(0) 
+1

C'est les symboles persans :) – parvij

+0

mais l'alphabet est le même, n'est ce pas? –

+0

Vous avez raison, c'est différent comme l'alphabet allemand et anglais. – parvij