NLP:基于操作码数据集
NLP: Stemming on opcodes data set
我有一个包含 27 个文件的数据集,每个文件都包含操作码。我想使用词干提取将相似操作码的所有版本映射到相同的操作码。例如:push、pusha、pushb等都会映射到push;
addf addi 到 add,multi multf 到 mult,等等)。我该怎么做?我尝试将 PorterStemmer 与 NLTK 扩展一起使用,但它不适用于我的数据集。我认为它只适用于正常的人类语言单词。 (喜欢播放,播放 --> 播放)而不是像 (pusha, pushb --> push) 这样的操作码。
我不认为词干提取是您想在这里做的。词干分析器是特定于语言的,并且基于该语言中常见的屈折形态模式。例如,在英语中,动词的不定式形式(例如 "to walk")会变成时态、体和 person/number:I walk vs. She walks (walk+s),I walk 与 walked (walk+ed),还有 walk+ing 等。词干分析器将这些随机分布编码为 "rules",然后将其应用于 "word" 以变为其词干。换句话说,您的操作码不存在现成的词干分析器。
您有两种可能的解决方案:(1) 创建字典或 (2) 编写您自己的词干分析器。如果您没有太多要映射的变体,那么创建一个自定义词典可能是最快的方法,您可以在其中使用所有单词变体作为键,而 lemma/stem/canonical-form 是值。
addi -> add
addf -> add
multi -> mult
multf -> mult
如果您的潜在映射太多而无法手动完成,那么您可以编写自定义正则表达式词干分析器来进行映射和转换。以下是您可以在 R 中执行此操作的方法。以下函数接受一个输入词,并尝试将其与表示词干所有变体的模式匹配,对于您集合中的所有 n
个词干。它 returns a 1 x n
data.frame 其中 1 表示存在或 0 表示不存在变异匹配。
#' Return word's stem data.frame with each column indicating presence (1) or
#' absence (0) of stem in that word.
map_to_stem_df <- function(word) {
## named list of patterns to match
stem_regex <- c(add = "^add[if]$",
mult = "^mult[if]$")
## iterate across the stem names
res <- lapply(names(stem_regex), function(stem) {
pat <- stem_regex[stem]
## if pattern matches word, then 1 else 0
if (grepl(pattern = pat, x = word)) {
pat_match <- 1
} else {
pat_match <- 0
}
## create 1x1 data.frame for stem
df <- data.frame(pat_match)
names(df) <- stem
return(df)
})
## bind all cols into single row data.frame 1 x length(stem_regex) & return
data.frame(res)
}
map_to_stem_df("addi")
# add mult
# 1 0
map_to_stem_df("additional")
# add mult
# 0 0
我有一个包含 27 个文件的数据集,每个文件都包含操作码。我想使用词干提取将相似操作码的所有版本映射到相同的操作码。例如:push、pusha、pushb等都会映射到push; addf addi 到 add,multi multf 到 mult,等等)。我该怎么做?我尝试将 PorterStemmer 与 NLTK 扩展一起使用,但它不适用于我的数据集。我认为它只适用于正常的人类语言单词。 (喜欢播放,播放 --> 播放)而不是像 (pusha, pushb --> push) 这样的操作码。
我不认为词干提取是您想在这里做的。词干分析器是特定于语言的,并且基于该语言中常见的屈折形态模式。例如,在英语中,动词的不定式形式(例如 "to walk")会变成时态、体和 person/number:I walk vs. She walks (walk+s),I walk 与 walked (walk+ed),还有 walk+ing 等。词干分析器将这些随机分布编码为 "rules",然后将其应用于 "word" 以变为其词干。换句话说,您的操作码不存在现成的词干分析器。
您有两种可能的解决方案:(1) 创建字典或 (2) 编写您自己的词干分析器。如果您没有太多要映射的变体,那么创建一个自定义词典可能是最快的方法,您可以在其中使用所有单词变体作为键,而 lemma/stem/canonical-form 是值。
addi -> add
addf -> add
multi -> mult
multf -> mult
如果您的潜在映射太多而无法手动完成,那么您可以编写自定义正则表达式词干分析器来进行映射和转换。以下是您可以在 R 中执行此操作的方法。以下函数接受一个输入词,并尝试将其与表示词干所有变体的模式匹配,对于您集合中的所有 n
个词干。它 returns a 1 x n
data.frame 其中 1 表示存在或 0 表示不存在变异匹配。
#' Return word's stem data.frame with each column indicating presence (1) or
#' absence (0) of stem in that word.
map_to_stem_df <- function(word) {
## named list of patterns to match
stem_regex <- c(add = "^add[if]$",
mult = "^mult[if]$")
## iterate across the stem names
res <- lapply(names(stem_regex), function(stem) {
pat <- stem_regex[stem]
## if pattern matches word, then 1 else 0
if (grepl(pattern = pat, x = word)) {
pat_match <- 1
} else {
pat_match <- 0
}
## create 1x1 data.frame for stem
df <- data.frame(pat_match)
names(df) <- stem
return(df)
})
## bind all cols into single row data.frame 1 x length(stem_regex) & return
data.frame(res)
}
map_to_stem_df("addi")
# add mult
# 1 0
map_to_stem_df("additional")
# add mult
# 0 0