Извлечение существительного + существительного или (прил. | Существительного) + существительного из текста - PullRequest
8 голосов
/ 05 января 2011

Я хотел бы спросить, возможно ли извлечь из существительного + существительное или (прилаг. | Существительное) + существительное в пакете R openNLP? То есть я хотел бы использовать лингвистическую фильтрацию для извлечения фраз-кандидатов из имен существительных.Не могли бы вы указать мне, как это сделать?Большое спасибо.


Спасибо за ответы.Вот код:

library("openNLP")

acq <- "Gulf Applied Technologies Inc said it sold its subsidiaries engaged in
        pipeline and terminal operations for 12.2 mln dlrs. The company said 
        the sale is subject to certain post closing adjustments, 
        which it did not explain. Reuter." 

acqTag <- tagPOS(acq)    
acqTagSplit = strsplit(acqTag," ")
acqTagSplit

qq = 0
tag = 0

for (i in 1:length(acqTagSplit[[1]])){
    qq[i] <-strsplit(acqTagSplit[[1]][i],'/')
    tag[i] = qq[i][[1]][2]
}

index = 0

k = 0

for (i in 1:(length(acqTagSplit[[1]])-1)) {

    if ((tag[i] == "NN" && tag[i+1] == "NN") | 
        (tag[i] == "NNS" && tag[i+1] == "NNS") | 
        (tag[i] == "NNS" && tag[i+1] == "NN") | 
        (tag[i] == "NN" && tag[i+1] == "NNS") | 
        (tag[i] == "JJ" && tag[i+1] == "NN") | 
        (tag[i] == "JJ" && tag[i+1] == "NNS"))
    {      
            k = k +1
            index[k] = i
    }

}

index

Считыватель может сослаться index на acqTagSplit для извлечения существительного + существительного или (прил | существительного) + извлечения существительного.(Код не оптимален, но работает. Если у вас есть идея, пожалуйста, дайте мне знать.)

Кроме того, у меня все еще есть проблема.

Justeson и Katz (1995) предложили еще одну лингвистическуюфильтрация для извлечения фраз кандидатов существительных:

((Adj | Существительное) + | ((Adj | Существительное) (Существительное-Подготовка)?) (Adj | Существительное) ) Существительное

Я не могу хорошо понять его значение.Не могли бы вы сделать мне одолжение, чтобы объяснить это или преобразовать такое представление в язык R.Большое спасибо.

Ответы [ 2 ]

5 голосов
/ 05 января 2011

У меня нет открытой консоли, чтобы проверить это, но вы пытались токенизировать с tagPOS и затем grep для "существительного", "существительного" или, возможно, вставки (tagPOS (acq), collapse = ".") и ищите "существительное. существительное".Затем можно использовать gregexpr для извлечения позиций.

РЕДАКТИРОВАТЬ: формат помеченного вывода немного отличается от того, что я запомнил.Я думаю, что этот метод read.table () после замены "\ n" для пробелов гораздо эффективнее, чем я вижу выше:

 acqdf <- read.table(textConnection(gsub(" ", "\n", acqTag)), sep="/", stringsAsFactors=FALSE)
 acqdf$nnadj <- grepl("NN|JJ", acqdf$V2)
 acqdf$nnadj 
# [1]  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE  TRUE
#[16] FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE
#[31]  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE
 acqdf$nnadj[1:(nrow(acqdf)-1)] & acqdf$nnadj[2:nrow(acqdf)]
# [1]  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
#[16] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE
#[31] FALSE FALSE FALSE FALSE FALSE FALSE
 acqdf$pair <- c(NA, acqdf$nnadj[1:(nrow(acqdf)-1)] & acqdf$nnadj[2:nrow(acqdf)])
 acqdf[1:7, ]

            V1  V2 nnadj  pair
1         Gulf NNP  TRUE    NA
2      Applied NNP  TRUE  TRUE
3 Technologies NNP  TRUE  TRUE
4          Inc NNP  TRUE  TRUE
5         said VBD FALSE FALSE
6           it PRP FALSE FALSE
7         sold VBD FALSE FALSE
3 голосов
/ 05 января 2011

Это возможно.

РЕДАКТИРОВАТЬ:

Вы получили это.Используйте тег POS и разделите пробелы: ll <- strsplit (acqTag, '').Оттуда итерации по длине списка ввода (длина ll), например: for (i в 1:37) {qq <-strsplit (ll [[1]] [i], '/')} и получить частьпоследовательности речи, которую вы ищете.</p>

После разбиения на пробелы это просто обработка списка в R.

...