2015-09-13 5 views
7

मेरे पास नीचे की तरह एक वेक्टर है और यह निर्धारित करना चाहते हैं कि सूची में कौन से तत्व मानव नाम हैं और जो नहीं हैं। मुझे मानवरूप पैकेज मिला, जो नामों को प्रारूपित करता है लेकिन दुर्भाग्य से यह निर्धारित नहीं करता है कि एक स्ट्रिंग वास्तव में एक नाम है या नहीं। मुझे इकाई निष्कर्षण के लिए कुछ पैकेज भी मिलते हैं, लेकिन उन्हें एक ही नाम के बजाय भाग-के-भाषण टैगिंग के लिए वास्तविक पाठ की आवश्यकता होती है।स्ट्रिंग्स की सूची से, पहचानें कि कौन से नाम मानव हैं और

उदाहरण

pkd.names.quotes <- c("Mr. Rick Deckard", # Name 
         "Do Androids Dream of Electric Sheep", # Not a name 
         "Roy Batty", # Name 
         "How much is an electric ostrich?", # Not a name 
         "My schedule for today lists a six-hour self-accusatory depression.", # Not a name 
         "Upon him the contempt of three planets descended.", # Not a name 
         "J.F. Sebastian", # Name 
         "Harry Bryant", # Name 
         "goat class", # Not a name 
         "Holden, Dave", # Name 
         "Leon Kowalski", # Name 
         "Dr. Eldon Tyrell") # Name 
+5

मेरा दोस्त इलेक्ट्रिक शुतुरमुर्ग यह देखने के लिए बहुत परेशान होगा कि उसका नाम वास्तव में एक नाम नहीं है। तो आपको यह जानने की आवश्यकता होगी कि वास्तव में नाम क्या निर्धारित करता है, सही? लेकिन आजकल लोग अपने बच्चों को कुछ भी (अमेरिका में वैसे भी) नाम देते हैं। उदाहरण के लिए कन्या वेस्ट के बच्चे को लें। उसका नाम उत्तर पश्चिम है। माना जाता है, कन्या एक बेवकूफ है, यह अभी भी सच है। वह नाम परीक्षण कैसे पास करेगा? –

+0

हाहा, काफी मेला। मुझे लगता है कि मुझे कन्या के बच्चों के नाम गलत लगेगा। हालांकि यह ठीक है, कुछ त्रुटि स्वीकार्य है। मैं केवल स्ट्रिंग लम्बाई, रिक्त स्थान की संख्या और पूंजीकरण पर भरोसा करने से बेहतर करने की उम्मीद कर रहा हूं। –

+1

स्टैनफोर्ड नामांकित इकाई पहचान "मॉड्यूल" आर https://rpubs.com/lmullen/nlp-chapter के लिए उपलब्ध है एनएलपी परिचय है। यह http://nlp.stanford.edu/software/CRF-NER.shtml जावा lib के लिए आधिकारिक स्रोत है और इससे समाधान तैयार करना संभव हो सकता है। – hrbrmstr

उत्तर

11

यहाँ एक दृष्टिकोण है। अमेरिकी जनगणना ब्यूरो अपने डेटाबेस में (आवृत्ति के साथ) 100 बार होने वाले उपनामों की एक सूची को सारणीबद्ध करता है: उनमें से सभी 152,000। यदि आप पूरी सूची का उपयोग करते हैं, तो आपके सभी तारों का नाम होता है। उदाहरण के लिए, "कक्षा", "उसे" और "द" कुछ भाषाओं में नाम हैं (सुनिश्चित नहीं हैं कि कौन सी भाषाएं हैं)। इसी तरह, पहले नामों की कई सूचियां हैं (देखें this post)।

नीचे दी गई कोड 2000 की जनगणना से सभी उपनामों को पकड़ती है, और पोस्ट के पहले नामों की एक सूची है, फिर प्रत्येक सूची में सबसे आम 10,000 के लिए सबसेट करता है, सूचियों को जोड़ता है और साफ़ करता है, और इसका उपयोग एक शब्दकोश के रूप में करता है tm पैकेज में यह पहचानने के लिए कि किन तारों में नाम हैं। आप freq वैरिएबल को बदलकर "संवेदनशीलता" को नियंत्रित कर सकते हैं (freq = 10,000 आपके इच्छित परिणाम उत्पन्न करने के लिए प्रतीत होता है)।

url <- "http://www2.census.gov/topics/genealogy/2000surnames/names.zip" 
tf <- tempfile() 
download.file(url,tf, mode="wb")      # download archive of surname data 
files <- unzip(tf, exdir=tempdir())    # unzips and returns a vector of file names 
surnames <- read.csv(files[grepl("\\.csv$",files)]) # 152,000 surnames occurring >100 times 
url <- "http://deron.meranda.us/data/census-derived-all-first.txt" 
firstnames <- read.table(url(url), header=FALSE) 
freq <- 10000 
dict <- unique(c(tolower(surnames$name[1:freq]), tolower(firstnames$V1[1:freq]))) 
library(tm) 
corp <- Corpus(VectorSource(pkd.names.quotes)) 
tdm <- TermDocumentMatrix(corp, control=list(tolower=TRUE, dictionary=dict)) 
m <- as.matrix(tdm) 
m <- m[rowSums(m)>0,] 
m 
#   Docs 
# Terms  1 2 3 4 5 6 7 8 9 10 11 12 
# bryant 0 0 0 0 0 0 0 1 0 0 0 0 
# dave  0 0 0 0 0 0 0 0 0 1 0 0 
# deckard 1 0 0 0 0 0 0 0 0 0 0 0 
# eldon  0 0 0 0 0 0 0 0 0 0 0 1 
# harry  0 0 0 0 0 0 0 1 0 0 0 0 
# kowalski 0 0 0 0 0 0 0 0 0 0 1 0 
# leon  0 0 0 0 0 0 0 0 0 0 1 0 
# rick  1 0 0 0 0 0 0 0 0 0 0 0 
# roy  0 0 1 0 0 0 0 0 0 0 0 0 
# sebastian 0 0 0 0 0 0 1 0 0 0 0 0 
# tyrell 0 0 0 0 0 0 0 0 0 0 0 1 
which(colSums(m)>0) 
# 1 3 7 8 10 11 12 
संबंधित मुद्दे