2017-08-30 17 views
0

私は与えられたステートメントから数値データを抽出する際に(openNLPを使ってRを使って)作業しています。Rのステートメントから数値データを抽出しますか?

文はここで予想される出力"Temperature > 37 - 39c","Air flow -> 80cfm""The room temperature is 37 to 39 C. The Air flow is near 80 cfm".

です。

名詞(NN)と次の番号データ(CD)を得るために、POSタグの正規表現パターンを提案できますか?

類似のデータを抽出する別の方法はありますか?

答えて

0

自然なテキストからのデータ抽出は難しいです!私はこのソリューションが非常に迅速に壊れることを期待しています。しかし、ここにあなたを始めさせる方法があります。あなたはタグ付きの文章全体を提供しなかったので、自分のタグを挿入しました。タグセットのためにこれを変更する必要があるかもしれません。また、このコードは効率的でもベクトル化もされておらず、単一の文字列に対してのみ機能します。

library(stringr) 

text <- "The_DT room_NN temperature_NN is_VBZ 37_CD to_PRP 39_CD C_NNU. The_DT Air_NN flow_NN is_VBZ near_ADV 80_CD cfm_NNU" 

# find the positions where a Number appears; it may be followed by prepositions, units and other numbers 
matches <- gregexpr("(\\w+_CD)+(\\s+\\w+_(NNU|PRP|CD))*", text, perl=TRUE) 

mapply(function(position, length) { 
    # extract all NN sequences 
    nouns <- text %>% str_sub(start = 1, end = position) %>% 
     str_extract_all("\\w+_NN(\\s+\\w+_NN)*") 
    # get Numbers 
    nums <- text %>% str_sub(start=position, end = position + length) 
    # format output string 
    result <- paste(tail(nouns[[1]], n=1), nums, sep = " > ") 
    # clean tags 
    gsub("_\\w+", "", result) 
}, matches[[1]], attr(matches[[1]], "match.length")) 
# output: [1] "room temperature > 37 to 39 C." "Air flow > 80 cfm" 
0

多分以下のアプローチから始めることができます。お役に立てれば!

library(NLP) 
library(openNLP) 
library(dplyr) 

s <- "The room temperature is 37 to 39 C. The Air flow is near 80 cfm" 
sent_token_annotator <- Maxent_Sent_Token_Annotator() 
word_token_annotator <- Maxent_Word_Token_Annotator() 
a2 <- annotate(s, list(sent_token_annotator, word_token_annotator)) 
pos_tag_annotator <- Maxent_POS_Tag_Annotator() 
a3 <- annotate(s, pos_tag_annotator, a2) 
#distribution of POS tags for word tokens 
a3w <- subset(a3, type == "word") 

#select consecutive NN & CD POS 
a3w_temp <- a3w[sapply(a3w$features, function(x) x$POS == "NN" | x$POS == "CD")] 
a3w_temp_df <- as.data.frame(a3w_temp) 
#add lead 'features' to dataframe and select rows having (NN, CD) or (NN, CD, CD) sequence 
a3w_temp_df$ahead_features = lead(a3w_temp_df$features,1) 
a3w_temp_df$features_comb <- paste(a3w_temp_df$features,a3w_temp_df$ahead_features) 
l <- row.names(subset(a3w_temp_df, features_comb == "list(POS = \"NN\") list(POS = \"CD\")" | 
     features_comb == "list(POS = \"CD\") list(POS = \"CD\")")) 
l_final <- sort(unique(c(as.numeric(l), as.numeric(l) +1))) 
a3w_df <- a3w_temp_df[l_final,] 

#also include POS which is immediately after CD 
idx <- a3w_df[a3w_df$features=="list(POS = \"CD\")","id"]+1 
idx <- sort(c(idx,a3w_df$id)) 
op = paste(strsplit(s, split = " ")[[1]][idx -1], collapse = " ") 
op 

出力は次のとおりです。

[1] "temperature 37 to 39 C. flow 80 cfm" 
+0

それは、彼らが将来的に同様の問題に直面した場合に他の人を助けるだろうと、それはあなたのクエリに答え場合は、正しい答えとしてマークする必要があり@Dhana。ありがとう! – Prem

関連する問題