2015-09-13 7 views
7

私は以下のようなベクトルを持ち、リスト内のどの要素が人間の名前であるかを判断したいと思います。私は、名前をフォーマットするhumaniformatパッケージを見つけましたが、残念ながら文字列が実際に名前であるかどうかは判断しません。エンティティ抽出用のパッケージもいくつか見つかりましたが、単一の名前ではなく、品詞タグ付けに実際のテキストが必要なようです。文字列のリストから、人間の名前であるかどうかを確認します。

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

私の友人エレクトリックオーストリッチは、彼の名前が本当に名前ではないことを知っているとひどく頭が痛いです。だから正確に何が名前を決定するのかを知る必要があります。しかし、今日、人々は(アメリカでは)とにかく何かについて子供たちの名前をつけています。たとえば、Kanye Westの子供を連れてください。彼の名前はノースウェストです。確かに、カニエは馬鹿ですが、これはまだ当てはまります。どのように名前のテストに合格しますか? –

+0

ハハ、十分に公正。私はカニエの子供の名前が間違っていると思います。しかし、それでも問題はありません。私は単に文字列の長さ、スペースの数、および大文字の使用に頼るよりもうまくやりたいと思っています。 –

+1

スタンフォードの名前付きエンティティ認識「モジュール」はRで利用可能です。https://rpubs.com/lmullen/nlp-chapterにはNLPイントロがあります。このhttp://nlp.stanford.edu/software/CRF-NER.shtmlはjava libの公式ソースであり、そこから解決策を作ることは可能かもしれません。 – hrbrmstr

答えて

11

は、ここに1つのアプローチです。米国国勢調査局は、そのデータベース(周波数を含む)で> 100回発生する姓のリストを作成します。フルリストを使用すると、すべての文字列に名前が付きます。たとえば、 "class"、 "him"、および "the"は特定の言語での名前です(どの言語を使用しているかはわかりません)。同様に、ファーストネームのリストが多数あります(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 
関連する問題