我有27个文件的数据集,每个文件包含操作码。我想使用词干将相似操作码的所有版本映射到相同操作码。例如:push,pusha,pushb等都将映射到push; addf将addi添加,将multimult添加为mult等)。我该怎么办?我尝试将PorterStemmer与NLTK扩展一起使用,但不适用于我的数据集。我认为它仅适用于普通的人类语言。 (就像播放,播放->播放),而不是像(pusha,pushb-> push)这样的操作码。
答案 0 :(得分:1)
我不认为你想在这里干什么。词干是特定于语言的,并且基于该语言中常见的词尾形态学模式。例如,在英语中,您有动词的不定式形式(例如,“走路”),它在时态,方面和人/数字上都变了形:我走路vs.她走路(walk + s),我走路vs.词干将这些随机分布编码为“规则”,然后将其应用于“单词”以变为其词干。换句话说,您的操作码不存在现成的词干分析器。
您有两种可能的解决方案:(1)创建字典或(2)编写自己的词干分析器。如果您没有太多要映射的变体,那么创建一个自定义词典可能是最快的,在字典中您将所有单词的变体用作键,并且以lemma / stem / canonical-form为值。
addi -> add
addf -> add
multi -> mult
multf -> mult
如果潜在的映射太多,无法手工完成,那么您可以编写一个自定义的正则表达式词干分析器来进行映射和转换。这是您在R中的操作方式。以下函数将一个输入字词并尝试将其与表示词干的所有变体的模式匹配,因为您的集合中的所有n
词干。它返回一个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