数据清洗与预处理是搜索技术中的一个重要步骤,主要包括去除无关字符、停用词过滤、分词、词干提取等操作。一个简单的Java示例,展示如何进行数据清洗与预处理:
该示例代码实现了一个简单的数据清洗与预处理方法preprocess,将输入的字符串进行HTML标签去除、转换为小写、去除标点符号和数字、分词、停用词过滤、词干提取等操作,并返回预处理后的字符串。
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class DataPreprocessor {
// 停用词列表,可以根据实际需求进行修改
private static final List<String> STOP_WORDS = new ArrayList<>();
static {
STOP_WORDS.add("a");
STOP_WORDS.add("an");
STOP_WORDS.add("and");
STOP_WORDS.add("the");
// 添加更多停用词...
}
public static String preprocess(String input) {
// 去除HTML标签
String cleanedText = removeHtmlTags(input);
// 转换为小写
cleanedText = cleanedText.toLowerCase();
// 去除标点符号和数字
cleanedText = removePunctuationAndDigits(cleanedText);
// 分词
List<String> tokens = tokenize(cleanedText);
// 停用词过滤
List<String> filteredTokens = removeStopWords(tokens);
// 词干提取(可选)
List<String> stemmedTokens = stem(filteredTokens);
// 将处理后的词语列表转换为字符串
String processedText = joinTokens(stemmedTokens);
return processedText;
}
private static String removeHtmlTags(String input) {
// 使用正则表达式去除HTML标签
String patternString = "<[^>]+>";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(input);
return matcher.replaceAll("");
}
private static String removePunctuationAndDigits(String input) {
// 使用正则表达式去除标点符号和数字
String patternString = "[^a-zA-Z\\s]";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(input);
return matcher.replaceAll("");
}
private static List<String> tokenize(String input) {
// 简单的分词方法,可以根据实际需求使用更复杂的分词算法
return java.util.Arrays.asList(input.split("\\s+"));
}
private static List<String> removeStopWords(List<String> tokens) {
List<String> filteredTokens = new ArrayList<>();
for (String token : tokens) {
if (!STOP_WORDS.contains(token)) {
filteredTokens.add(token);
}
}
return filteredTokens;
}
private static List<String> stem(List<String> tokens) {
// 执行词干提取操作,这里使用一个简单的示例算法
List<String> stemmedTokens = new ArrayList<>();
for (String token : tokens) {
// 假设词干提取算法为将单词末尾的"ing"、"ed"等后缀去除
if (token.endsWith("ing")) {
stemmedTokens.add(token.substring(0, token.length() - 3));
} else if (token.endsWith("ed")) {
stemmedTokens.add(token.substring(0, token.length() - 2));
} else {
stemmedTokens.add(token);
}
}
return stemmedTokens;
}
private static String joinTokens(List<String> tokens) {
// 将词语列表转换为字符串
return String.join(" ", tokens);
}
public static void main(String[] args) {
String input = "This is a sample <b>text</b> with HTML tags, punctuation, and digits like 12345.";
String processedText = preprocess(input);
System.out.println(processedText);
}
}