Отслеживание близости слов - PullRequest
3 голосов
/ 21 июня 2010

Я работаю над небольшим проектом, который включает в себя поиск по словарю в коллекции документов. В моем словаре есть положительные сигнальные слова (или хорошие слова), но в коллекции документов просто поиск слова не гарантирует положительного результата, поскольку, например, могут быть отрицательные слова (не значащие), которые могут находиться рядом с этими положительными словами. , Я хочу построить матрицу так, чтобы она содержала номер документа, положительное слово и его близость к отрицательным словам.

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

No significant drug interactions have been reported in studies of candesartan cilexetil given with other drugs such as glyburide, nifedipine, digoxin, warfarin, hydrochlorothiazide.   

Это мой пример документа, в котором кандесартан цилексетил, глибурид, нифедипин, дигоксин, варфарин, гидрохлоротиазид являются моими положительными словами, и мое существенное отрицательное слово не имеет значения. Я хочу сделать сопоставление (основанное на словах) между моими положительными и отрицательными словами.

Кто-нибудь может дать несколько полезных советов?

Ответы [ 2 ]

5 голосов
/ 21 июня 2010

Прежде всего, я бы предложил не использовать R для этой задачи.R отлично подходит для многих вещей, но текстовые манипуляции не относятся к числу таких.Python может быть хорошей альтернативой.

Тем не менее, если бы я реализовал это в R, я бы, вероятно, сделал что-то вроде (очень очень грубое):

# You will probably read these from an external file or a database
goodWords <- c("candesartan cilexetil", "glyburide", "nifedipine", "digoxin", "blabla", "warfarin", "hydrochlorothiazide")
badWords <- c("no significant", "other drugs")

mytext <- "no significant drug interactions have been reported in studies of candesartan cilexetil given with other drugs such as glyburide, nifedipine, digoxin, warfarin, hydrochlorothiazide."
mytext <- tolower(mytext) # Let's make life a little bit easier...

goodPos <- NULL
badPos <- NULL

# First we find the good words
for (w in goodWords)
    {
    pos <- regexpr(w, mytext)
    if (pos != -1)
        {
        cat(paste(w, "found at position", pos, "\n"))
        }
    else    
        {
        pos <- NA
        cat(paste(w, "not found\n"))
        }

    goodPos <- c(goodPos, pos)
    }

# And then the bad words
for (w in badWords)
    {
    pos <- regexpr(w, mytext)
    if (pos != -1)
        {
        cat(paste(w, "found at position", pos, "\n"))
        }
    else    
        {
        pos <- NA
        cat(paste(w, "not found\n"))
        }

    badPos <- c(badPos, pos)
    }

# Note that we use -badPos so that when can calculate the distance with rowSums
comb <- expand.grid(goodPos, -badPos)
wordcomb <- expand.grid(goodWords, badWords)
dst <- cbind(wordcomb, abs(rowSums(comb)))

mn <- which.min(dst[,3])
cat(paste("The closest good-bad word pair is: ", dst[mn, 1],"-", dst[mn, 2],"\n"))
3 голосов
/ 21 июня 2010

Вы смотрели на один из

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...