搜索引擎:文档词条化与语料处理
词条化:将给定的字符串拆分成一系列子序列的过程,其中每个子序列称为一个词条(token)
用户在搜索引擎中的输入,应当经过词条化处理后再传入后端进行检索。
(1) 符号清除
Python
python的string模块下的 punctuation 包含所有的英文标点符号
利用Python自带的字符串置换方法 就能够完成符号的清除。
punctuation_string = string.punctuation
lines = re.sub('[{}]'.format(punctuation_string), " ", text)
输入 'I believe you!And you?'
输出 'I believe you And you '
JAVA
利用正则表达式与JAVA字符串的替换
Matcher m = Pattern.compile("[\n`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。, ·、?]").matcher(text);
String newtext = m.replaceAll("").trim();
(2) 大小写转换
Python
单词’Apple’与‘apple’应当视作同一词项 我们统一处理为小写
扫描二维码关注公众号,回复:
14831764 查看本文章
string = string.lower()
输入 'I believe you And you '
输出 'i believe you and you '
JAVA
String text = text.toLowerCase()
(3) 英文切片
Python
不同于中文切片的繁琐 英文单词本身就带有自然的分隔符。
lsplit = lines.split()
输入 'i believe you and you '
输出 ['i', 'believe', 'you', 'and', 'you']
JAVA
Arrays.toString(text.split(" "))
(4) 移除停用词
过于常见的词汇在文档和用户需求进行匹配时价值并不大,需要彻底从词汇表中去除。
Python
一些极为常用的词项 如‘you’,‘I’,'and’被视作停用词
因其频率过高 在任何文档内都极容易出现 因此去除对它们的统计。
en_stop = get_stop_words('en')
stopped_tokens = [i for i in token if i not in en_stop]
输入 ['i', 'believe', 'you', 'and', 'you']
输出 ['believe', 'really', 'wait']
(5) 词干提取
因为语言的不同语法要求,文档中常常包含某一词汇的不同形态,
我们检索某一词汇时,包含了该单词的其他形态的文档,也应当被返回。
单词’believes’与‘believe’应当视作同一词项,我们统一提取为同一词干
词干并不一定是正确符合语法的单词,它只是为使不同词语成为同一形式。
Python
p_stemmer = PorterStemmer()
texts = [p_stemmer.stem(i) for i in stopped_tokens]
输入 ['believe', 'really', 'wait', 'believes']
输出 ['believ', 'realli', 'wait', 'believ']
JAVA
PorterStemmer stem = new PorterStemmer();
stem.setCurrent("happyness");
stem.stem();
String result = stem.getCurrent();
(6) 去除重复
构成词项词典的词条不应重复 进行简单的去重操作
word_list = list(dict.fromkeys(word_list))
输入 ['believ', 'realli', 'wait', 'believ']
输出 ['believ', 'realli', 'wait']