Чтение текстового файла с ненормальным разделителем - PullRequest
0 голосов
/ 30 апреля 2020

Я использую алгоритм для лемматизации текстового вектора. На выходе получается файл .txt, который хранится так, как показано на рисунке ниже. output

Исходное слово указано в первом столбце, а различные леммы перечислены во втором столбце, за которым следуют некоторые грамматические классификации. Я хочу прочитать это в R, но понятия не имею, как это сделать. Я пробовал различные формы разделителей, но, похоже, ни один из них не работает.

В идеале я хочу, чтобы кадр данных в R выглядел следующим образом, где я читаю только первое вхождение каждой леммы:

wanted structure

Возможно, лучшим вариантом может быть чтение данных, сохранение только первого вхождения (ie. Da da adv), затем сделать что-то вроде текста в столбцах и сохранить только первые два столбца.

Вывод алгоритма лемматизации:

"<da>"
    "da" adv
    "da" sbu
    "da" subst fork
"<dette>"
    "dette" det dem nøyt ent
    "dette" pron nøyt ent pers 3
    "dette" verb inf
"<er>"
    "være" verb pres <aux1/perf_part>
"<den>"
    "den" det dem fem ent
    "den" det dem mask ent
    "den" pron mask fem ent pers 3

Требуемая структура:

da      da 
dette   dette
er  være
den den

Ответы [ 2 ]

2 голосов
/ 30 апреля 2020

Вот интересный результат: вы можете довольно хорошо прочитать файл с помощью read.table:

s <- '"<da>"
    "da" adv
    "da" sbu
    "da" subst fork
"<dette>"
    "dette" det dem nøyt ent
    "dette" pron nøyt ent pers 3
    "dette" verb inf
"<er>"
    "være" verb pres <aux1/perf_part>
"<den>"
    "den" det dem fem ent
    "den" det dem mask ent
    "den" pron mask fem ent pers 3
 '

 x <- read.table(sep='', text=s, colClasses=c('character','character'), flush=TRUE, fill=TRUE)

> x
        V1    V2   V3
1     <da>           
2       da   adv     
3       da   sbu     
4       da subst fork
5  <dette>           
6    dette   det  dem
7    dette  pron nøyt
8    dette  verb  inf
9     <er>           
10    være  verb pres
11   <den>           
12     den   det  dem
13     den   det  dem
14     den  pron mask

Используя пакеты dplyr и tidyr, мы можем распаковать его в:

(y <- x %>% mutate(a=grepl('<', V1, fixed=TRUE), b=cumsum(a)) %>% 
  group_by(b) %>% 
  summarise(verbs=list(t(unique(V1)))) %>% 
  unnest(cols=c(verbs)))
# A tibble: 4 x 2
      b verbs[,1] [,2] 
  <int> <chr>     <chr>
1     1 <da>      da   
2     2 <dette>   dette
3     3 <er>      være 
4     4 <den>     den  

result <- y$verbs
 result[,1] <- gsub('(<|>)', '', result[,1])


    [,1]    [,2]   
[1,] "da"    "da"   
[2,] "dette" "dette"
[3,] "er"    "være" 
[4,] "den"   "den"
0 голосов
/ 30 апреля 2020

Это сработало для меня, когда скопировал текст в текстовый файл:

#Read the data
data <- readLines('temp.txt')
#index where new group starts. I have considered no whitespace at the beginning
# of the string as an indication for new group.
groups <- !startsWith(data, ' ')
#Since the first word is same in the entire group, we take first word 
#from 2nd element as 1st element is group name
value <- tapply(data, cumsum(groups), function(x) 
                     sub('"(\\w+).*', '\\1', trimws(x[2])))
#Create dataframe with group name and value. 
data.frame(groups = data[groups], value)


#    groups value
#1    "<da>"    da
#2 "<dette>" dette
#3    "<er>"  være
#4   "<den>"   den
...