Quanteda: создание нграмм и скипграмм из токенов в R - PullRequest
0 голосов
/ 25 августа 2018

Я просматривал пакет quanteda в R и не мог понять, как функционирует tokens_skipgrams. Ниже пример из руководства этого пакета , что я не совсем уверен, что хорошо его понял:

tokens_skipgrams(toks, n = 3, skip = 0:2, concatenator = " ")   
tokens from 1 document.
text1 :
[1] "insurgents killed in"        "insurgents killed ongoing"  
[3] "insurgents killed fighting"  "insurgents in ongoing"      
[5] "insurgents in fighting"      "insurgents ongoing fighting"
[7] "killed in ongoing"           "killed in fighting"         
[9] "killed ongoing fighting"     "in ongoing fighting"        

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

 "insurgents killed in"    "killed in ongoing"    "in ongoing fighting" 
 "insurgents in fighting"

Почему результат включает:

  "insurgents killed ongoing"  
  "insurgents killed fighting"  
  "insurgents in ongoing"      
  "insurgents ongoing fighting"
  "killed in fighting"         
  "killed ongoing fighting" 

В приведенном выше примере skip = 0: 2, то есть skip равно 0, 1 и 2. Поэтому я думал, что приведенная выше команда может быть безопасно разбита на 3 части, и комбинация каждой из них даст мне результат, выше которого как я указал, я не мог получить.

tokens_skipgrams(toks, n = 3, skip = 0, concatenator = " ")   
tokens from 1 document.
text1 :
[1] "insurgents killed in" "killed in ongoing"    "in ongoing fighting" 

tokens_skipgrams(toks, n = 3, skip = 1, concatenator = " ")   
tokens from 1 document.
text1 :
[1] "insurgents in fighting"


tokens_skipgrams(toks, n = 3, skip = 2, concatenator = " ")   
tokens from 1 document.
text1 :
character(0)

Но комбинация результатов дает мне именно то, что я ожидал получить, а не тот, что приведен выше.

Кто-нибудь может решить эту проблему для меня?

1 Ответ

0 голосов
/ 26 августа 2018

Поведение, которое вы наблюдаете, является реализацией определения скиаграммы Гутри и др. (2006): «A k skip-грамм - это нграмма, которая является надмножеством всех нграмм и каждого ( k -i) пропускается до ( k -i) == 0 (включая 0 пропусков). "(Это цитируется на справочной странице quanteda для ?tokens_skipgram. Первоначальный источник - Гатри, Д., Б. Эллисон, В. Лю и Л. Гатри. 2006. "Более пристальный взгляд на моделирование скип-грамм". ".).Пример s02 ниже взят непосредственно из этой статьи, в том, что он называет «2-skip-tri-grams».

Для скалярных значений skip, однако, эта рекурсивная реализация пропусковне реализовано, чтобы дать пользователю максимальный контроль.

Это объясняет разницу в предоставлении значений skip в виде отдельных шкал, как указано выше, а затем в виде последовательности 0:2.Для

toks <- tokens("insurgents killed in ongoing fighting")
toks
# tokens from 1 document.
# text1 :
# [1] "insurgents" "killed"     "in"         "ongoing"    "fighting" 

мы наблюдаем такие комбинации, как «боевики убили, сражаясь», когда skip = 0:2, потому что это включает пропуск 0 (между «боевиками» и «убитыми») и 2 (между «убитыми» и «борьба с ").Для этой фразы это означает, что есть только две дополнительные скипграммы от перехода от skip = 0:1 до skip = 0:2:

(s01 <- tokens_skipgrams(toks, n = 3, skip = 0:1, concatenator = " "))
# tokens from 1 document.
# text1 :
# [1] "insurgents killed in"      "insurgents killed ongoing" "insurgents in ongoing"    
# [4] "insurgents in fighting"    "killed in ongoing"         "killed in fighting"       
# [7] "killed ongoing fighting"   "in ongoing fighting"      

(s02 <- tokens_skipgrams(toks, n = 3, skip = 0:2, concatenator = " "))
# tokens from 1 document.
# text1 :
# [1] "insurgents killed in"        "insurgents killed ongoing"   "insurgents killed fighting" 
# [4] "insurgents in ongoing"       "insurgents in fighting"      "insurgents ongoing fighting"
# [7] "killed in ongoing"           "killed in fighting"          "killed ongoing fighting"    
# [10] "in ongoing fighting"        

setdiff(as.character(s02), as.character(s01))
# [1] "insurgents killed fighting"  "insurgents ongoing fighting"
...