(R) Plotting the Results of Text Analysis: 'x' is a list, but does not have components 'x' and 'y'

Viewed 16

I am working with the R programming language.

I am trying to follow this text analysis tutorial here https://rforanalytics.com/16.7-topic-modelling.html for some data that I have created.

First, I created the data for this problem (using restaurant reviews I found online):

library(udpipe)
library(data.table)
library(stopwords)
library(BTM)
library(textplot)
library(ggraph)

my_data = structure(list(id = 1:8, reviews = c("I guess the employee decided to buy their lunch with my card my card hoping I wouldn't notice but since it took so long to run my car I want to head and check my bank account and sure enough they had bought food on my card that I did not receive leave. Had to demand for and for a refund because they acted like it was my fault and told me the charges are still pending even though they are for 2 different amounts.", 
                                            "I went to McDonald's and they charge me 50 for Big Mac when I only came with 49. The casher told me that I can't read correctly and told me to get glasses. I am file a report on your casher and now I'm mad.", 
                                            "I really think that if you can buy breakfast anytime then I should be able to get a cheeseburger anytime especially since I really don't care for breakfast food. I really like McDonald's food but I preferred tree lunch rather than breakfast. Thank you thank you thank you.", 
                                            "I guess the employee decided to buy their lunch with my card my card hoping I wouldn't notice but since it took so long to run my car I want to head and check my bank account and sure enough they had bought food on my card that I did not receive leave. Had to demand for and for a refund because they acted like it was my fault and told me the charges are still pending even though they are for 2 different amounts.", 
                                            "Never order McDonald's from Uber or Skip or any delivery service for that matter, most particularly one on Elgin Street and Rideau Street, they never get the order right. Workers at either of these locations don't know how to follow simple instructions. Don't waste your money at these two locations.", 
                                            "Employees left me out in the snow and wouldn’t answer the drive through. They locked the doors and it was freezing. I asked the employee a simple question and they were so stupid they answered a completely different question. Dumb employees and bad food.", 
                                            "McDonalds food was always so good but ever since they add new/more crispy chicken sandwiches it has come out bad. At first I thought oh they must haven't had a good day but every time I go there now it's always soggy, and has no flavor. They need to fix this!!!", 
                                            "I just ordered the new crispy chicken sandwich and I'm very disappointed. Not only did it taste horrible, but it was more bun than chicken. Not at all like the commercial shows. I hate sweet pickles and there were two slices on my sandwich. I wish I could add a photo to show the huge bun and tiny chicken."
)), class = "data.frame", row.names = c(NA, -8L))

Then, I downloaded the English text model:

udpipe_download_model("english-ewt", model_dir = "~/Desktop/")
eng_model = udpipe_load_model("~/Desktop/english-ewt-ud-2.5-191206.udpipe")
out = udpipe(iconv(my_data$reviews, from = 'latin1', to = 'UTF-8'), object = eng_model)

I then further formatted the data:

biterms <- as.data.table(out)
biterms <- biterms[, cooccurrence(x = lemma, relevant = upos %in% c("NOUN", "ADJ",
    "VERB") & nchar(lemma) > 2 & !lemma %in% stopwords("en"), skipgram = 3), by = list(doc_id)]

Next, I fit the model:

set.seed(999)
traindata <- subset(out, upos %in% c("NOUN", "ADJ", "VERB") & !lemma %in% stopwords("en") &
    nchar(lemma) > 2)
traindata <- traindata[, c("doc_id", "lemma")]
# fit 10 topics (other parameters are mostly default)
model <- BTM(traindata, biterms = biterms, k = 10, iter = 2000, background = FALSE,
    trace = 2000)

The problem happens when I tried to plot the results:

biterms1 = terms(model, type = "biterms")$biterms

plot(model, subtitle = "#auspol 14-20 Sep 2020", biterms = biterms1, labels = paste(round(model$theta *
    100, 2), "%", sep = ""), top_n = 20)

I get the following error:

Error in xy.coords(x, y, xlabel, ylabel, log) : 
  'x' is a list, but does not have components 'x' and 'y'

Can someone please show me what I am doing wrong and what I can do to fix this problem?

Thanks!

1 Answers

Your code is running fine when I tried to replicate your error. You can tried to remove all your packages except base packages before running the plot() to see if that solve the problem:

#   Remove loaded packages except base packages ----
lapply(names(sessionInfo()$otherPkgs), function(pkgs) #Unload all non base package
  detach(paste0('package:', pkgs), character.only = T,unload = T,force = T))

Here is the structure of model if you want to compare with the one you call for your plot:

> str(model)
List of 9
 $ model     :<externalptr> 
 $ K         : int 10
 $ W         : int 96
 $ alpha     : num 5
 $ beta      : num 0.01
 $ iter      : int 2000
 $ background: logi FALSE
 $ theta     : num [1:10] 0.0751 0.0593 0.0988 0.0909 0.0751 ...
 $ phi       : num [1:96, 1:10] 0.000345 0.000345 0.069406 0.000345 0.000345 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:96] "able" "account" "act" "add" ...
  .. ..$ : NULL
 - attr(*, "class")= chr "BTM"

Here is the plot generated:

 plot(model,
     subtitle = "#auspol 14-20 Sep 2020",
     biterms = biterms1,
     labels = paste(round(model$theta *100, 2), "%", sep = ""), top_n = 20)

enter image description here

Related