stemDocment в пакете tm не работает над словом прошедшего времени
У меня есть файл 'check_text.txt', который содержит слова "говорит, говорит, говорит, сделал". Я хотел бы выполнить это, чтобы получить "скажи, скажи, сделай, сделай, сделай". Я пытался использовать stemDocument
в tm
пакет, как указано ниже, но только получить "сказал, скажи, скажи, сделай, сделал". Есть ли способ выполнить слова в прошедшем времени? Нужно ли это делать в реальной обработке естественного языка? Спасибо!
filename = 'check_text.txt'
con <- file(filename, "rb")
text_data <- readLines(con,skipNul = TRUE)
close(con)
text_VS <- VectorSource(text_data)
text_corpus <- VCorpus(text_VS)
text_corpus <- tm_map(text_corpus, stemDocument, language = "english")
as.data.frame(text_corpus)$text
РЕДАКТИРОВАТЬ: я также пытался wordStem
в SnowballC
пакет
> library(SnowballC)
> wordStem(c("said", "say", "says", "make", "made"))
[1] "said" "sai" "sai" "make" "made"
1 ответ
Если в пакете есть набор данных неправильных английских глаголов, эта задача будет легкой. Я просто не знаю ни одного пакета с такими данными, поэтому я решил создать свою собственную базу данных с помощью очистки. Я не уверен, что этот сайт охватывает все неправильные слова. При необходимости вы хотите искать лучшие сайты, чтобы создать свою собственную базу данных. Как только у вас есть база данных, вы можете заниматься своей задачей.
Во-первых, я использовал stemDocument()
и очистить существующие формы с -s. Затем я собрал прошлые формы в words
(То есть, past
) инфинитивные формы прошлых форм (т.е. inf1
), определили порядок прошлых форм в temp
, Я также определил позиции прошлых форм в temp
, Я наконец заменил сат формы на их инфинитивные формы. Я повторил ту же процедуру для прошлых причастий.
library(tm)
library(rvest)
library(dplyr)
library(splitstackshape)
### Create a database
x <- read_html("http://www.englishpage.com/irregularverbs/irregularverbs.html")
x %>%
html_table(header = TRUE) %>%
bind_rows %>%
rename(Past = `Simple Past`, PP = `Past Participle`) %>%
filter(!Infinitive %in% LETTERS) %>%
cSplit(splitCols = c("Past", "PP"),
sep = " / ", direction = "long") %>%
filter(complete.cases(.)) %>%
mutate_each(funs(gsub(pattern = "\\s\\(.*\\)$|\\s\\[\\?\\]",
replacement = "",
x = .))) -> mydic
### Work on the task
words <- c("said", "drawn", "say", "says", "make", "made", "done")
### says to say
temp <- stemDocument(words)
### past forms become present form
### Collect past forms
past <- mydic$Past[which(mydic$Past %in% temp)]
### Collect infinitive forms of past forms
inf1 <- mydic$Infinitive[which(mydic$Past %in% temp)]
### Identify the order of past forms in temp
ind <- match(temp, past)
ind <- ind[is.na(ind) == FALSE]
### Where are the past forms in temp?
position <- which(temp %in% past)
temp[position] <- inf1[ind]
### Check
temp
#[1] "say" "drawn" "say" "say" "make" "make" "done"
### PP forms to infinitive forms (same as past forms)
pp <- mydic$PP[which(mydic$PP %in% temp)]
inf2 <- mydic$Infinitive[which(mydic$PP %in% temp)]
ind <- match(temp, pp)
ind <- ind[is.na(ind) == FALSE]
position <- which(temp %in% pp)
temp[position] <- inf2[ind]
### Check
temp
#[1] "say" "draw" "say" "say" "make" "make" "do"