Избегайте перекрывающихся терминов, используя kwic в Quanteda - PullRequest
0 голосов
/ 04 февраля 2019

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

corpus <- c("According to the Canadian Charter of Rights and Freedoms, all Canadians...")

dict <- dictionary(list(constitution = c("charter of rights", "canadian charter"))) 

kwic(corpus, dict)

Вышеприведенное (правильно) идентифицирует следующее предложениедважды:

"According to the Canadian Charter of Rights and Freedoms, all Canadians..."

Однако, чтобы установить частоту, с которой появляются эти термины, и чтобы избежать двойного учета, мне нужно убедиться, что случаи, когда появляется термин "канадская хартия", учитываются толькоесли за ним не следует "..of rights ..."

Как мне это сделать?

Редактировать: только что заметил, что это не проблема, если вы используетеtokens_lookup так что этот вопрос немой.Оставьте это на тот случай, если это пригодится кому-то еще

1 Ответ

0 голосов
/ 04 февраля 2019

Когда вы запрашиваете kwic, вы получите все совпадения с образцами, даже если они перекрываются.Таким образом, способ избежать наложения, как я думаю, вы спрашиваете, - вручную преобразовать выражения из нескольких слов (MWE) в отдельные токены таким образом, чтобы предотвратить их наложение.В вашем случае вы хотите сосчитать «канадскую хартию», если за ней не следует «прав».Затем я бы предложил вам сделать токенизацию текста, а затем составить MWE в последовательности, гарантирующей, что они не будут перекрываться.

library("quanteda", warn.conflicts = FALSE)
## Package version: 1.4.0
## Parallel computing: 2 of 12 threads used.
## See https://quanteda.io for tutorials and examples.
txt <- "The Canadian charter of rights and the Canadian charter are different."
dict <- dictionary(list(constitution = c("charter of rights", "canadian charter")))

toks <- tokens(txt)
tokscomp <- toks %>%
  tokens_compound(phrase("charter of rights"), concatenator = " ") %>%
  tokens_compound(phrase("Canadian charter"), concatenator = " ")
tokscomp
## tokens from 1 document.
## text1 :
## [1] "The"               "Canadian"          "charter of rights"
## [4] "and"               "the"               "Canadian charter" 
## [7] "are"               "different"         "."

Это превратило фразы в отдельные токены, разделенные здесь пробелом, иэто будет означать, что kwic() (если это то, что вы хотите использовать) не будет дважды считать их, поскольку они теперь уникально совпадают с MWE.

kwic(tokscomp, dict, window = 2)
##                                                             
##  [text1, 3] The Canadian | charter of rights | and the      
##  [text1, 6]      and the | Canadian charter  | are different

Обратите внимание, что просто для их подсчета вы могли бы иметьиспользовал dfm() со своим словарем в качестве значения аргумента select:

dfm(tokscomp, select = dict)
## Document-feature matrix of: 1 document, 2 features (0.0% sparse).
## 1 x 2 sparse Matrix of class "dfm"
##        features
## docs    charter of rights canadian charter
##   text1                 1                1

Наконец, если вы хотели принципиально отличить «Канадскую хартию прав» от «Канадской хартии», вы могли бы иметьвначале составляли первое, а затем второе (самое длинное - самое короткое здесь).Но это не совсем то, что вы спросили.

...