背景
由于项目组需要对爬虫获取的文本进行归类,最初使用正则表达式按照想到的规则进行解析分类,后来发现这种方式不够灵活,而且不能穷举所有的可能。所以项目组觉得使用最近比较流行的机器学习相关的知识去处理。
相关知识
对文本进行分类之前,需要先对文本进行分词,然后将分词转换为特征向量,使用机器学习算法模型对特征向量和已经知道的标签数据进行模型拟合,产生理想的模型,通过理想的模型进行预测未来产生的数据
分词
英文分词
英文文档已经天然的分好词,根据空格字符就可以做出很精准的分词,只要控制好停用词即可。以下是spark已经为我们封装好的英文分词和停用词API使用介绍。
import org.apache.spark.ml.feature.Tokenizer
import org.apache.spark.sql.functions._
val sentenceDataFrame = spark.createDataFrame(Seq(
(0, "Hi I heard about Spark"),
(1, "I wish Java could use case classes"),
(2, "Logistic,regression,models,are,neat")
)).toDF("id", "sentence")
val tokenizer = new Tokenizer().setInputCol("sentence").setOutputCol("words")
val tokenized = tokenizer.transform(sentenceDataFrame)
tokenized.select("sentence", "words").show(false)
以上代码输出结果
+-----------------------------------+------------------------------------------+
|sentence |words |
+-----------------------------------+------------------------------------------+
|Hi I heard Spark about Spark |[hi, i, heard, spark, about, spark] |
|I wish Java could use case classes |[i, wish, java, could, use, case, classes]|
|Logistic regression models are neat|[logistic, regression, models, are, neat] |
+-----------------------------------+------------------------------------------+
中文分词
中文分词比英文分词复杂很多,需要根据中文语义和中文词典进行分词。还好关于中文分词的工具很多大牛已经帮我们做好了,我们只要根据API去调用即可。本人在实践中最初使用了IKAnalysis,但是发现IKAnalysis分词器的性能很差,几百万的行的文本分词竟然跑不出来。后来,在同事的推荐下使用了HanNlp中文分词器,解决了性能上面的瓶颈。
词向量转化工具
TF-IDF
TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。
关于TF-IDF的计算公式如下:
T F I D F = T F × I D F TFIDF=TF × IDF TFIDF=TF