簡體   English   中英

使用 tm() 挖掘 PDF 中的兩個和三個單詞短語

[英]Using tm() to mine PDFs for two and three word phrases

我正在嘗試為特定的兩個和三個單詞短語挖掘一組 PDF。 我知道這個問題是在各種情況下被問到的,並且

解決方案部分有效。 但是,該列表不會返回包含多個單詞的字符串。

例如,我已經嘗試過這些線程中提供的解決方案herehere (以及許多其他人)。 不幸的是,沒有任何效果。

此外,qdap 庫不會加載,我浪費了一個小時試圖解決這個問題,所以這個解決方案也不起作用,即使它看起來相當容易。

library(tm)

data("crude")
crude <- as.VCorpus(crude)
crude <- tm_map(crude, content_transformer(tolower))

my_words <- c("contract", "prices", "contract prices", "diamond", "shamrock", "diamond shamrock")

dtm <- DocumentTermMatrix(crude, control=list(dictionary = my_words))

# create data.frame from documenttermmatrix
df1 <- data.frame(docs = dtm$dimnames$Docs, as.matrix(dtm), row.names = NULL)
head(df1)

如您所見,output 返回“contract.prices”而不是“contract prices”,所以我正在尋找一個簡單的解決方案。 文件 127 包含短語“合同價格”,因此該表應至少記錄一個實例。

我也很樂意分享我的實際數據,但我不確定如何保存其中的一小部分(它是巨大的)。 所以現在我正在使用“原始”數據的替代品。

這是一種使用 tm package 和 RWeka 來獲得所需內容的方法。 您需要創建一個單獨的標記器 function 並將其插入DocumentTermMatrix function。 RWeka 在這方面與tm配合得非常好。

如果由於 java 依賴關系而不想安裝 RWeka,則可以使用任何其他 package,例如 tidytext 或 quanteda。 如果您因為數據的大小而需要速度,我建議您使用 quanteda package(tm 代碼下方的示例)。 Quanteda 並行運行,您可以使用quanteda_options指定要使用的內核數(默認為 2 個內核)。

筆記:

請注意,字典中的一元和二元重疊。 在所使用的示例中,您將看到在文本 127 中“價格”(3) 和“合同價格”(1) 將重復計算價格。

library(tm)
library(RWeka)

data("crude")
crude <- as.VCorpus(crude)
crude <- tm_map(crude, content_transformer(tolower))

my_words <- c("contract", "prices", "contract prices", "diamond", "shamrock", "diamond shamrock")


# adjust to min = 2 and max = 3 for 2 and 3 word ngrams
RWeka_tokenizer <- function(x) {
  NGramTokenizer(x, Weka_control(min = 1, max = 2)) 
}

dtm <- DocumentTermMatrix(crude, control=list(tokenize = RWeka_tokenizer,
                                              dictionary = my_words))

# create data.frame from documenttermmatrix
df1 <- data.frame(docs = dtm$dimnames$Docs, as.matrix(dtm), row.names = NULL, check.names = FALSE)

如果你有一個大的語料庫 quanteda,速度可能會更好:

library(quanteda)

corp_crude <- corpus(crude)
# adjust ngrams to 2:3 for 2 and 3 word ngrams
toks_crude <- tokens(corp_crude, ngrams = 1:2, concatenator = " ")
toks_crude <- tokens_keep(toks_crude, pattern = dictionary(list(words = my_words)), valuetype = "fixed")
dfm_crude <- dfm(toks_crude)
df1 <- convert(dfm_crude, to = "data.frame")

如果您首先將多詞模式包裝在phrase() function 中,則可以在quanteda中使用一系列標記。

library("quanteda")
#> Package version: 1.5.1

data("crude", package = "tm")
data_corpus_crude <- corpus(crude)

my_words <- c("diamond", "contract prices", "diamond shamrock")

例如,您可以使用kwic()提取這些。

kwic(data_corpus_crude, pattern = phrase(my_words))
#>                                                               
#>    [127, 1:1]                             |     Diamond      |
#>    [127, 1:2]                             | Diamond Shamrock |
#>  [127, 12:13]        today it had cut its | contract prices  |
#>  [127, 71:71] a company spokeswoman said. |     Diamond      |
#>                                   
#>  Shamrock Corp said that effective
#>  Corp said that effective today   
#>  for crude oil by 1.50            
#>  is the latest in a

或者,要將它們永久地變成“復合”標記,請使用tokens_compound() (此處顯示為一個簡單示例)。

tokens("The diamond mining company is called Diamond Shamrock.") %>%
    tokens_compound(pattern = phrase(my_words))
#> tokens from 1 document.
#> text1 :
#> [1] "The"              "diamond"          "mining"          
#> [4] "company"          "is"               "called"          
#> [7] "Diamond_Shamrock" "."

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM