rm(list = ls())
date()
## [1] "Fri Aug 16 21:43:39 2019"
sessionInfo()
## R version 3.5.1 (2018-07-02)
## Platform: x86_64-apple-darwin15.6.0 (64-bit)
## Running under: macOS  10.14.6
## 
## Matrix products: default
## BLAS: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRblas.0.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRlapack.dylib
## 
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## loaded via a namespace (and not attached):
##  [1] compiler_3.5.1  magrittr_1.5    tools_3.5.1     htmltools_0.3.6
##  [5] yaml_2.2.0      Rcpp_1.0.0      stringi_1.2.4   rmarkdown_1.11 
##  [9] knitr_1.21      stringr_1.3.1   xfun_0.4        digest_0.6.18  
## [13] evaluate_0.12

Библиотеки

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(readtext)
## Warning: package 'readtext' was built under R version 3.5.2
library(quanteda)
## Warning: package 'quanteda' was built under R version 3.5.2
## Package version: 1.4.3
## Parallel computing: 2 of 4 threads used.
## See https://quanteda.io for tutorials and examples.
## 
## Attaching package: 'quanteda'
## The following object is masked from 'package:utils':
## 
##     View
library(stringr)

Чтение текстов

Data <- readtext("../AllTexts"
                 , docvarsfrom = "filepaths"
                 , dvsep = "[/]")
Data <- select(Data, doc_id, text, group = docvar3) #Можно сразу переименовать колонку

Обработка названий файлов

Сохраняю названия на всякий случай, но в таблице делаю короткий вариант

filenames <- data.frame(names = Data$doc_id
                        , docId = paste0(Data$group, 1:length(Data$group))
                        , stringsAsFactors = FALSE)
Data$doc_id <- filenames$docId

Создание корпуса с исходными текстам

Corpus <- corpus(Data)
CorpusSummary <- summary(Corpus, n = 10000)
CorpusSummary
## Corpus consisting of 226 documents:
## 
##        Text Types Tokens Sentences   group
##        Bio1   592   1004        58     Bio
##        Bio2   496    927        44     Bio
##        Bio3   373    679        22     Bio
##        Bio4   370    639        35     Bio
##        Bio5   546    949        58     Bio
##        Bio6   658   1303        38     Bio
##        Bio7   581   1112        42     Bio
##        Bio8   395    775        30     Bio
##        Bio9   465    775        44     Bio
##       Bio10   691   1239        68     Bio
##       Bio11   471    896        54     Bio
##       Bio12   517   1006        66     Bio
##       Bio13   340    563        32     Bio
##       Bio14   473    776        40     Bio
##       Bio15   396    715        57     Bio
##       Bio16   284    469        18     Bio
##       Bio17   385    614        32     Bio
##       Bio18   352    589        43     Bio
##       Bio19   317    674        25     Bio
##       Bio20   428    733        48     Bio
##       Bio21   395    693        38     Bio
##       Bio22   504    915        45     Bio
##       Bio23   543   1019        66     Bio
##       Bio24   412    741        39     Bio
##       Bio25   407    640        33     Bio
##       Bio26   519    871        50     Bio
##       Bio27   322    591        30     Bio
##       Bio28   366    608        38     Bio
##       Bio29   435    780        43     Bio
##      Chem30   246    422        22    Chem
##      Chem31   544    878        35    Chem
##      Chem32   479    824        45    Chem
##      Chem33   356    596        38    Chem
##      Chem34   482    875        54    Chem
##      Chem35   620   1051        51    Chem
##      Chem36   803   1598        85    Chem
##      Chem37   385    743        45    Chem
##      Chem38   253    410        19    Chem
##      Chem39   282    439        31    Chem
##      Chem40   415    725        36    Chem
##      Chem41   290    506        21    Chem
##      Chem42   301    508        25    Chem
##      Chem43   356    634        35    Chem
##      Chem44   357    675        37    Chem
##      Chem45   571    970        57    Chem
##      Chem46   331    554        29    Chem
##      Chem47   267    480        36    Chem
##      Chem48   524    836        39    Chem
##      Chem49   652   1368        72    Chem
##      Chem50   434    901        52    Chem
##      Chem51   394    788        48    Chem
##      IDOR52   514   1158        50    IDOR
##      IDOR53   616   1254        93    IDOR
##      IDOR54   430    749        36    IDOR
##      IDOR55   346    614        43    IDOR
##      IDOR56   434    768        39    IDOR
##      IDOR57   538   1038        61    IDOR
##      IDOR58   579   1181        63    IDOR
##      IDOR59   466    823        51    IDOR
##      IDOR60   480    833        48    IDOR
##      IDOR61   569   1005        76    IDOR
##      IDOR62   592   1058        53    IDOR
##      IDOR63   412    747        31    IDOR
##      IDOR64   422    690        38    IDOR
##      IDOR65   398    722        37    IDOR
##      IDOR66   405    711        48    IDOR
##      IDOR67   553    995        52    IDOR
##      IDOR68   723   1360        86    IDOR
##      IDOR69   457    804        39    IDOR
##      IDOR70   350    735        41    IDOR
##      IDOR71   521    851        43    IDOR
##      IDOR72   529   1086        39    IDOR
##      IDOR73   524    977        58    IDOR
##      IDOR74   485    839        46    IDOR
##      IDOR75   580   1081        57    IDOR
##      IDOR76   642   1238        64    IDOR
##      IDOR77   402    689        42    IDOR
##      IDOR78   470    761        40    IDOR
##      IDOR79   477    824        45    IDOR
##      IDOR80   583   1011        49    IDOR
##      IDOR81   496    810        38    IDOR
##      IDOR82   378    690        29    IDOR
##      IDOR83   432    803        38    IDOR
##      IDOR84   525    927        57    IDOR
##      IDOR85   357    542        25    IDOR
##      IDOR86   483    786        38    IDOR
##      IDOR87   430    707        30    IDOR
##      IDOR88   463    905        32    IDOR
##      IDOR89   253    471        32    IDOR
##      IDOR90   414    695        37    IDOR
##      IDOR91   511    955        57    IDOR
##      IDOR92   512   1057        40    IDOR
##      IDOR93   524    967        54    IDOR
##      IDOR94   494    835        35    IDOR
##      IDOR95   592   1028        65    IDOR
##      IDOR96   387    738        36    IDOR
##      IDOR97   452    738        35    IDOR
##      IDOR98   400    753        38    IDOR
##      IDOR99   489    976        31    IDOR
##     IDOR100   516    909        44    IDOR
##     IDOR101   402    701        33    IDOR
##     IDOR102   403    679        47    IDOR
##     IDOR103   510    917        53    IDOR
##     IDOR104   581   1075        35    IDOR
##     IDOR105   479    855        48    IDOR
##     IDOR106   511    949        50    IDOR
##     IDOR107   555    929        62    IDOR
##     IDOR108   729   1436        60    IDOR
##     IDOR109   417    760        53    IDOR
##     IDOR110   479   1059        31    IDOR
##     IDOR111   392    698        20    IDOR
##     IDOR112   511    914        49    IDOR
##     IDOR113   425    773        42    IDOR
##     IDOR114   434    842        48    IDOR
##     IDOR115   466    836        53    IDOR
##     IDOR116   454    782        25    IDOR
##     IDOR117   403    709        36    IDOR
##     IDOR118   474    851        45    IDOR
##     IDOR119   389    685        38    IDOR
##     IDOR120   495   1023        45    IDOR
##     IDOR121   510   1026        58    IDOR
##     IDOR122   467    848        54    IDOR
##     IDOR123   487    891        45    IDOR
##     IDOR124   484    928        44    IDOR
##     IDOR125   418   1014        82    IDOR
##     IDOR126   602   1191        47    IDOR
##     IDOR127   489    900        58    IDOR
##     IDOR128   502    845        37    IDOR
##     IDOR129   339    579        37    IDOR
##     IDOR130   636   1212        59    IDOR
##     IDOR131   421    715        40    IDOR
##     IDOR132   397    668        36    IDOR
##     IDOR133   308    510        33    IDOR
##     IDOR134   417    722        29    IDOR
##     IDOR135   309    494        16    IDOR
##     IDOR136   384    754        53    IDOR
##     IDOR137   320    578        39    IDOR
##     IDOR138   495    859        55    IDOR
##     IDOR139   406    668        22    IDOR
##     IDOR140   413    657        35    IDOR
##     IDOR141   537    949        63    IDOR
##     IDOR142   536   1071        67    IDOR
##     IDOR143   473    897        53    IDOR
##     IDOR144   644   1282        57    IDOR
##     IDOR145   455    796        37    IDOR
##     IDOR146   445    777        43    IDOR
##     IDOR147   616   1105        64    IDOR
##     IDOR148   486    759        20    IDOR
##     IDOR149   425    731        29    IDOR
##     IDOR150   452    769        36    IDOR
##     IDOR151   400    695        39    IDOR
##     IDOR152   549   1019        65    IDOR
##     IDOR153   432    782        29    IDOR
##     IDOR154   482    827        41    IDOR
##     IDOR155   573    984        53    IDOR
##     IDOR156   806   1454        91    IDOR
##     IDOR157   443    841        48    IDOR
##     IDOR158   410    698        28    IDOR
##     IDOR159   462    915        69    IDOR
##     IDOR160   559   1001        57    IDOR
##     IDOR161   666   1242        88    IDOR
##     IDOR162   332    524        27    IDOR
##     IDOR163   578   1167        46    IDOR
##     IDOR164   607   1293        68    IDOR
##     IDOR165   468    871        38    IDOR
##     IDOR166   414    764        35    IDOR
##     IDOR167   509    903        64    IDOR
##     IDOR168   472    989        54    IDOR
##     IDOR169   556    934        60    IDOR
##     IDOR170   540   1074        41    IDOR
##     IDOR171   642   1310        65    IDOR
##     IDOR172   472    879        43    IDOR
##     IDOR173   579    969        49    IDOR
##     IDOR174   451    801        21    IDOR
##     IDOR175   386    621        35    IDOR
##     IDOR176   806   1486        85    IDOR
##     IDOR177   488    916        52    IDOR
##     IDOR178   830   1572        92    IDOR
##     IDOR179   654   1142        72    IDOR
##     IDOR180   470    796        37    IDOR
##     IDOR181   427    779        24    IDOR
##  IP16-10182   333    529        31 IP16-10
##  IP16-10183   397    767        64 IP16-10
##  IP16-10184   418    688        38 IP16-10
##  IP16-10185   308    496        34 IP16-10
##  IP16-10186   497    834        49 IP16-10
##  IP16-10187   485    946        37 IP16-10
##  IP16-10188   400    708        33 IP16-10
##  IP16-10189   476    804        46 IP16-10
##  IP16-10190   432    782        40 IP16-10
##  IP16-10191   488    947        48 IP16-10
##  IP16-10192   473    833        44 IP16-10
##  IP16-10193   426    725        47 IP16-10
##  IP16-10194   434    727        47 IP16-10
##  IP18-42195   482    799        44 IP18-42
##  IP18-42196   435    857        55 IP18-42
##  IP18-42197   359    798        34 IP18-42
##  IP18-42198   402    710        19 IP18-42
##  IP18-42199   465    830        31 IP18-42
##  IP18-42200   510    880        46 IP18-42
##  IP18-42201   524    902        54 IP18-42
##  IP18-42202   879   2015       202 IP18-42
##  IP18-42203   487    787        35 IP18-42
##  IP18-42204   779   1320        87 IP18-42
##  IP18-42205   559    945        56 IP18-42
##  IP18-42206   437    796        39 IP18-42
##    Sluzh207   348    584        24   Sluzh
##    Sluzh208   501    930        54   Sluzh
##    Sluzh209   424    722        47   Sluzh
##    Sluzh210   382    714        32   Sluzh
##    Sluzh211   285    602        25   Sluzh
##    Sluzh212   509    875        36   Sluzh
##    Sluzh213   454    843        41   Sluzh
##    Sluzh214   386    658        40   Sluzh
##    Sluzh215   614   1220        98   Sluzh
##    Sluzh216   455    807        40   Sluzh
##    Sluzh217   370    664        45   Sluzh
##    Sluzh218   519    945        48   Sluzh
##    Sluzh219   386    814        65   Sluzh
##    Sluzh220   503    969        71   Sluzh
##    Sluzh221   485    846        47   Sluzh
##    Sluzh222   568   1056        41   Sluzh
##    Sluzh223   459    753        27   Sluzh
##    Sluzh224   525    927        56   Sluzh
##    Sluzh225   573   1011        45   Sluzh
##    Sluzh226   403    694        39   Sluzh
## 
## Source: /Users/Petr001/Documents/Документы/Научные_проекты/ЭКОинструмент/R_script_4.1/Ecoinstrument_4.1/* on x86_64 by Petr001
## Created: Fri Aug 16 21:43:41 2019
## Notes:
summary(CorpusSummary[-1])
##      Types           Tokens         Sentences         group          
##  Min.   :246.0   Min.   : 410.0   Min.   : 16.00   Length:226        
##  1st Qu.:402.2   1st Qu.: 714.2   1st Qu.: 36.00   Class :character  
##  Median :469.0   Median : 828.5   Median : 43.00   Mode  :character  
##  Mean   :472.8   Mean   : 858.2   Mean   : 46.13                     
##  3rd Qu.:524.0   3rd Qu.: 968.5   3rd Qu.: 54.00                     
##  Max.   :879.0   Max.   :2015.0   Max.   :202.00
table(CorpusSummary$group)
## 
##     Bio    Chem    IDOR IP16-10 IP18-42   Sluzh 
##      29      22     130      13      12      20

Стемминг текстов

Функция для стемминга -n Построчный режим; каждое слово печатается на новой строке. -c Копировать весь ввод на вывод. То есть, не только слова, но и межсловные промежутки. Опция необходима для возврата к полному представлению текста. В случае построчного вывода (когда задана опция n) межсловные промежутки вытягиваются в одну строку, символы перевода строки заменяются на и/или . Пробел для большей видимости заменяется на подчеркивание. Символ  заменяется на \, подчеркивание на _. Таким образом можно однозначно восстановить исходный текст. -w Печатать только словарные слова. -l Не печатать исходные словоформы, только леммы и граммемы. -i Печатать грамматическую информацию, расшифровка ниже. -g Склеивать информацию словоформ при одной лемме (только при включенной опции -i). -s Печатать маркер конца предложения (только при включенной опции -c). -e Кодировка ввода/вывода. Возможные варианты: cp866, cp1251, koi8-r, utf-8 (по умолчанию). -d Применить контекстное снятие омонимии. –eng-gr Печатать английские обозначения граммем. –filter-gram Строить разборы только с указанными граммемами. –fixlist Использовать файл с пользовательским словарём. –format Формат вывода.Возможные варианты: text, xml, json. Значение по умолчанию — text. –generate-all Генерировать все возможные гипотезы для несловарных слов. –weight Печатать бесконтекстную вероятность леммы.

system2("./mystem", args = "-v") #Вывод версии программы Mystem
mystem <- function(doc, arg, format = "") { # Можно вствить формат вывода
        # " --format xml" и " -- format json"
        sdoc <- system2("./mystem"
                        , args = paste0("-", arg, format)
                        , stdout = TRUE 
                        # TRUE (capture the output
                        # in a character vector)
                        , input = doc)
        sdoc
}

Части речи

A прилагательное ADV наречие ADVPRO местоименное наречие ANUM числительное-прилагательное APRO местоимение-прилагательное COM часть композита - сложного слова CONJ союз INTJ междометие NUM числительное PART частица PR предлог S существительное SPRO местоимение-существительное V глагол

Стемминг Mystem

aTime <- Sys.time()
Data_S <- Data
for (i in 1:length(Data$text)) {
        Data_S$text[i] <- paste(mystem(Data$text[i], "cligsd"), collapse = "{\\s}") %>% # Майстем выдает по абзацам - склеиваю абзацы
                        # добавляю маркеры конца предложения
        str_extract_all("([{])(([\\\\а-яa-z]+))([^{}]+)([}])") %>% # Открывающая скобка, один слеш (нужно написать четыре) или буква русская или латинская, один или несколько любых символов кроме скобок, закрывающая скобка
        unlist(.) %>% 
        str_replace("([{])([а-я?-]+)([=])([[:alpha:]]+)([=,])([[:graph:]]*?)()([}])"
                     , "\\2_\\4") %>% 
        str_replace("([{])([:graph:]*)([}])", "\\2") %>% 
        str_c(collapse = " ")
       
}
bTime <- Sys.time()
bTime - aTime
## Time difference of 4.786082 mins
#Data_S$text[1]
# добавляю конце предложения в разбивку абзацев. Майстем по обзацам выдаёт и нужно объединять
# # . Точка позволяет вствить в другое место pipe operator

Корпус Стемминг

Corpus_S <- corpus(Data_S)
CorpusSummary_S <- summary(Corpus_S, n = 1000)
#CorpusSummary_S[-1]
summary(CorpusSummary_S[-1])
##      Types           Tokens         Sentences         group          
##  Min.   :194.0   Min.   : 387.0   Min.   : 1.000   Length:226        
##  1st Qu.:315.0   1st Qu.: 666.8   1st Qu.: 1.000   Class :character  
##  Median :361.0   Median : 779.0   Median : 2.000   Mode  :character  
##  Mean   :367.2   Mean   : 817.6   Mean   : 2.903                     
##  3rd Qu.:407.0   3rd Qu.: 926.8   3rd Qu.: 3.000                     
##  Max.   :650.0   Max.   :2188.0   Max.   :31.000
table(CorpusSummary$group)
## 
##     Bio    Chem    IDOR IP16-10 IP18-42   Sluzh 
##      29      22     130      13      12      20

Запись корпуса на диск

save(Corpus, file = "Corpus.RData")
save(Corpus_S, file = "Corpus_S.RData")