面试题答案
一键面试实现思路
- 数据预处理:
- 文本清洗:去除文本中的特殊字符、标点符号、停用词等,将文本转换为纯文本格式,降低数据噪声。
- 分词:将文本分割成单个的词或词组,常用的分词方式有基于空格、正则表达式等,在Ruby中可以使用
split
方法等。
- 特征提取:
- 可以使用词袋模型(Bag - of - Words),统计每个词在文本中出现的频率,将文本转换为向量表示。
- 或者使用TF - IDF(Term Frequency - Inverse Document Frequency),它衡量一个词在文档集合中的重要性,综合考虑词频和逆文档频率。
- 选择分类算法:
- 简单的可以使用朴素贝叶斯算法,它基于贝叶斯定理,在文本分类中有较好的效果,对小规模数据表现良好,计算成本低。
- 也可以考虑支持向量机(SVM),它通过寻找一个最优超平面来对数据进行分类,对于线性可分和近似线性可分的数据有较好的分类效果。
- 模型训练:
- 使用已标注好类别的文本数据(积极和消极文本样本)来训练选择的分类算法模型。
- 预测:
- 对新的未分类文本,经过数据预处理和特征提取后,使用训练好的模型进行类别预测。
关键Ruby代码片段
- 数据预处理:
require 'nokogiri'
require 'open - uri'
require 'active_support/core_ext/string'
# 去除HTML标签
def strip_html(html)
Nokogiri::HTML(html).text
end
# 去除特殊字符和标点符号
def clean_text(text)
text.gsub(/[[:punct:]]/, '').downcase
end
# 去除停用词
def remove_stopwords(text)
stopwords = %w(a an the and or in of to for with is are was were)
words = text.split
words.reject { |word| stopwords.include?(word) }.join(' ')
end
- 词袋模型特征提取:
def bag_of_words(text)
words = text.split
word_count = Hash.new(0)
words.each { |word| word_count[word] += 1 }
word_count
end
- 使用朴素贝叶斯进行分类(简单示例,假设已有训练数据):
class NaiveBayesClassifier
def initialize
@positive_count = 0
@negative_count = 0
@positive_word_count = Hash.new(0)
@negative_word_count = Hash.new(0)
end
def train(text, label)
words = bag_of_words(clean_text(text))
if label == 'positive'
@positive_count += 1
words.each { |word, count| @positive_word_count[word] += count }
else
@negative_count += 1
words.each { |word, count| @negative_word_count[word] += count }
end
end
def predict(text)
words = bag_of_words(clean_text(text))
positive_score = @positive_count.to_f / (@positive_count + @negative_count)
negative_score = @negative_count.to_f / (@positive_count + @negative_count)
words.each do |word, count|
positive_score *= (@positive_word_count[word] + 1).to_f / (@positive_word_count.values.sum + @positive_word_count.keys.size)
negative_score *= (@negative_word_count[word] + 1).to_f / (@negative_word_count.values.sum + @negative_word_count.keys.size)
end
positive_score > negative_score? 'positive' : 'negative'
end
end
使用示例:
classifier = NaiveBayesClassifier.new
classifier.train('This is a great product', 'positive')
classifier.train('This is a bad product', 'negative')
puts classifier.predict('This product is awesome')