|
本帖最后由 guojiasheng 于 2016-7-21 14:15 编辑
今天看了以往不知道什么时候写的处理文本的一些代码,记录下来,希望对大家有用。{:101:}
文本分类,简单的就拿反作弊来说。
用户发的帖子有时候会包括一些广告,招聘,不健康等内容,我们需要想个办法把这些垃圾帖(spam)干掉,那么帖子有 spam 和 normal,这就是一个二分类问题的。一般来说,spam还是少的,所以有时候也是个不平衡的二分类问题。
我们这边简单就说明一些如何基于当前用户发的帖子内容进行一些粗超处理,不考虑其他一些用户行为等等。
当前发的帖子内容,就是文本,有时候还包括图片,图片可以使用OCR技术,识别出文字,接着走文本的流程。
那如何对这些文本提取特征,训练分类器呢?
这个套路还是比较清晰的,那不管怎么样,我们肯定要把这些训练语料转为某个向量表示吧。
这边简单使用python的scikit-learn进行一个说明。
1.首先叫做预处理,preprocessing:
分词可以使用python的jieba库:
- def getsegments(sentence):
- return jieba.cut(sentence)
复制代码
去除停用词(stop_words),就是把那些语气词,没什么卵用的词给去掉,比如啊,好吧,是,也是这一类词,比如下面我这样的,把停用词都放到一个文本里面,然后用map存储,遇到一样的就删除掉。当然这边segin是对文本语聊分词之后的数据。
- def stopwordfilter(segin,segout):
- stopwords = open ("newsstopword.txt",'r')
- stopwords_dict = {}
- for line in stopwords:
- stopwords_dict[line.strip()] = "1"
- stopwords.close()
- si = open(segin,'r')
- so = open(segout,'w')
- tiedic = {}
- for s in si:
- words = s.split()
- newwords = ""
- for word in words:
- if stopwords_dict.has_key(word):
- continue
- else:
- newwords += (word + " ")
- if tiedic.has_key(newwords) == False:
- tiedic[newwords] = "1"
- so.write('%s\n' % newwords)
- si.close()
- so.close()
复制代码
2.在sklearn.feature_extraction.text库里面包含了多种不同的对文本提取特征的方法:
(1)CountVectorizer 提取了词频tf 特征
(2)TfidfVectorizer 提取tfIdf
(3)chi 卡方特征
这边一般会配合使用SelectKBest()方法,获取靠前的top k个特征。
- from sklearn.feature_extraction.text import CountVectorizer
- from sklearn.feature_extraction.text import TfidfTransformer
- from sklearn.feature_selection import SelectKBest, chi2
- from sklearn.feature_extraction.text import TfidfVectorizer
- from sklearn.naive_bayes import MultinomialNB
- import numpy as np
- from sklearn.feature_extraction.text import TfidfVectorizer
- from sklearn import metrics
- from text.textpredict import *
- from sklearn.cross_validation import *
- def train():
- train_words=["急需 钱用 不用 出售 如图 价值 千多 便宜 出售 出售 急 ",
- "读 读 重复 读好输 不变 绿 求高人 指点迷津 ",
- "诚召搛只呆家小时工,全职妈妈、在校学生、在家待业者、上班族、游戏者皆可做!每天5",
- "发福利了 火熱找小莳工,每天在綫2--3小莳,莳涧地點没限制,薪资鈤结80--150/",
- "急招小时工,每天在綫2--3小拭,时间地点没限制,薪资日结80--150/天,适 急招小时工,每天在綫2--3小拭,时间地点没限制,薪资日结80--150/天,适合学生党,手机党,上班族,有空闲时间者,有興趣缪系,QQ(937117723)咨询,此处不回!!",
- "发福利来 火熱找小莳工,每天在綫2--3小莳,莳涧地點没限制,薪资鈤结80--150/",
- " 读 不好 呜呜 ","这句 话 总是 知道 连读 ","求 师傅 交 口语 求有 耐心 老师 基础 学 ",
- "听到 读 "
- ]
- train_tags=[1,0,1,1,1,1,0,0,0,0]
- ##就提取了词频CountVectorizer
- count_v1 = CountVectorizer(stop_words=None, max_df=0.5)
- counts_train = count_v1.fit_transform(train_words)
- ##卡方检验chi,配合selectkbest 对特征进行选择
- chi= SelectKBest(chi2,10)
- mychi2 = chi.fit(counts_train, train_tags)
- hi2_train = mychi2.transform(counts_train)
- clf = MultinomialNB(alpha=0.01)
- clf.fit(hi2_train, np.asarray(train_tags))
- priedict = cross_val_predict(clf, hi2_train, train_tags)
- print metrics.confusion_matrix(train_tags, priedict)
- ##tf-idf
- Tfidf = TfidfVectorizer()
- tfidf_train = Tfidf.fit_transform(train_words)
- clf = MultinomialNB(alpha=0.01)
- clf.fit(tfidf_train, np.asarray(train_tags))
- priedict = cross_val_predict(clf, tfidf_train, train_tags)
- print metrics.confusion_matrix(train_tags, priedict)
- #print hi2_train
- train()
复制代码
|
|