中文文本分类调试笔记


完整代码:我的网盘/工作/项目源码--CSDN/NLP-ChineseTextClassfier


文档1:1.chinese_text_word_cloud 

    核心:根据词频对单词进行显示。

    本文档工作:分词、去停用词,统计词频,做词云

----------------------------------------------------------

文档2  2.chinese_text_analysis调试

本文档工作:

          1.基于TF-IDF和Text-Rank的关键词提取。

                    jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())

                    jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')) 直接使用,接口相同,注意默认过滤词性。

                  注:sentence是所有文档组成的一个str字符串。

                          以上函数,自带分词功能,因此关键词提取功能不需要另外做分词以及做停用词。(TF-IDF有自带类似去停用词功能,权重)

          2.LDA主题模型(无监督分类)

              需要先进行分词,并去停用词,然后处理成如下格式。

                  首先我们要把文本内容处理成固定的格式,一个包含句子的list,list中每个元素是分词后的词list。类似下面这个样子。

[[第,一,条,新闻,在,这里],[第,二,条,新闻,在,这里],[这,是,在,做, 什么],...]

               然后词袋模型,生成字典和语料(corpus),并调用LD模型进行主题分类,基于对待测文本进行主题分类。

dictionary = corpora.Dictionary(sentences)
corpus = [dictionary.doc2bow(sentence) for sentence in sentences]
lda = gensim.models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=20)将文档分成20个主题。 
for topic in lda.print_topics(num_topics=20, num_words=8): print topic[1] //打印每一个主题
0.024*"发展" + 0.020*"企业" + 0.017*"技术" + 0.015*"产业" + 0.014*"中国" + 0.014*"创新" + 0.013*"行业" + 0.013*"领域"
0.020*"直播" + 0.011*"活动" + 0.009*"国美" + 0.008*"母婴" + 0.007*"现场" + 0.006*"比特" + 0.006*"电视" + 0.006*"生活"
0.014*"软件" + 0.010*"云端" + 0.010*"时间" + 0.008*"文件" + 0.008*"小时" + 0.008*"隔离" + 0.006*"北京" + 0.006*"实时"
0.040*"产品" + 0.016*"品牌" + 0.016*"消费者" + 0.015*"市场" + 0.012*"体验" + 0.008*"用户" + 0.008*"消费" + 0.007*"学校"
0.033*"用户" + 0.019*"勒索" + 0.018*"信息" + 0.018*"手机" + 0.016*"攻击" + 0.016*"网络" + 0.012*"系统" + 0.011*"诈骗"

------------------------------------------------------------------------------------------------

文档3:3.chinese_text_classifier

用机器学习方法完成中文文本分类

输入形态:

CountVectorizer
bow : bag of words
ti-idf : text features
word2vec : cbow/skip-gram (单个维度没有物理含义)
传统机器学习模型:

Naive Bayes
SVM
RF
GBDT
深度学习模型:

MLP
CNN
LSTM

数据包括:科技、汽车、娱乐、军事、运动5类。

      1.用机器学习方法对文本进行分类,首先需要进行分词、去停用词,构建(X,Y)类型向量。

def preprocess_text(content_lines, sentences, category):
    for line in content_lines:
        try:
            segs=jieba.lcut(line)
            segs = filter(lambda x:len(x)>1, segs)
            segs = filter(lambda x:x not in stopwords, segs)
            sentences.append((" ".join(segs), category))
        except Exception,e:
            print line
            continue 

#生成训练数据
sentences = []

preprocess_text(technology, sentences, 'technology')

   2.打乱文本顺序,并将训练数据分为训练数据和验证数据。

from sklearn.model_selection import train_test_split
x, y = zip(*sentences)
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1234)

3.然后将文本数据进行词向量构照。

 有如下几种形式的词向量

* CountVectorizer
* bow : bag of words
* ti-idf : text features
* word2vec : cbow/skip-gram (单个维度没有物理含义)

4向量构造完毕,就可以采用机器学习进行建模和训练了。

  包括:调试参数、交叉验证等。

说明:词袋入行中有ngram_range可进行调试参数。

CountVectorizer(analyzer='ngram_rangeword', ngram_range=(1,4), max_features=20000)。

TfidfVectorizer(analyzer='word', ngram_range=(1,3), max_features=12000)

------------------------------------------------------------------------    

中文自然语言处理分析

代码1:

import jieba.analyse as analyse
import pandas as pd
df = pd.read_csv("./data/technology_news.csv", encoding='utf-8')
df = df.dropna()
print(type(df))
print(df[:3])
lines=df.content.values.tolist()
print(type(lines))
print(lines[:3])
content = "".join(lines)
print ("  ".join(analyse.extract_tags(content, topK=30, withWeight=False, allowPOS=())))

打印的LOG:

<class 'pandas.core.frame.DataFrame'>
   Unnamed: 0                                            content
0           0    ,中新网,1月7日电  恰逢CES 2017拉开大幕,却惊闻“AlphaGo升级版”的M...
1           1    徐立,商汤科技CEO在谈起本次参展时谈到:“作为一个成立刚刚两年的创业公司,这次参展,一...
2           2    正如最后挑战Master的古力在落败后发表的观点:“人类与人工智能共同探索围棋世界的大幕...
<class 'list'>
['\u3000\u3000,中新网,1月7日电\xa0 恰逢CES 2017拉开大幕,却惊闻“AlphaGo升级版”的Master迎来60连胜,人类顶尖围棋手在一周内纷纷败给这个谷歌旗下DeepMind团队打造的“围棋大脑”,显然也为聚焦于人工智能的本届CES增添了声势。而首次参展,并致力于打造“原创AI大脑”的中国深度学习领军企业的商汤科技,在人工智能的浪潮之巅,及众多业界前辈和巨匠面前,将会交出一份怎样的答卷呢?', '\u3000\u3000徐立,商汤科技CEO在谈起本次参展时谈到:“作为一个成立刚刚两年的创业公司,这次参展,一方面是展示我们最新的人工智能技术和产品,但另一方面,其实是向外表达,我们对于人工智能的理解。人工智能在特定领域中超越人类,是其广泛应用的标志。这与Master的胜利,为围棋世界开拓的新局面不谋而合。”', '\u3000\u3000正如最后挑战Master的古力在落败后发表的观点:“人类与人工智能共同探索围棋世界的大幕即将拉开,新一次的围棋革命正在进行着”。商汤科技的展台,尽管只有两块屏幕,但却带来对人工智能带来的变革的最好诠释:一面是可以通过深度学习,在千万级目标库中,300ms内即可获得比对结果的人脸识别“黑科技”;另一面,是国产前十智能手机都在运用的手机“电眼神器”。']
用户  2016  互联网  手机  平台  人工智能  百度  2017  智能  技术  数据  360  服务  直播  产品  企业  安全  视频  移动  应用  网络  行业  游戏  机器人  电商  内容  中国  领域  通过  发展

代码2:

import jieba.analyse as analyse
import pandas as pd
df = pd.read_csv("./data/military_news.csv", encoding='utf-8')
df = df.dropna()
lines=df.content.values.tolist()
content = "".join(lines)
print ("  ".join(analyse.extract_tags(content, topK=30, withWeight=False, allowPOS=())))
print(type("  ".join(analyse.extract_tags(content, topK=30, withWeight=False, allowPOS=()))))
print (analyse.extract_tags(content, topK=30, withWeight=False, allowPOS=()))
print (analyse.extract_tags(content, topK=30, withWeight=True, allowPOS=()))
print ("  ".join(analyse.extract_tags(content, topK=30, withWeight=True, allowPOS=())))

说明:“ ”.join(list):将list中内容连接成一个字符串

打印的LOG:

航母  训练  海军  中国  官兵  部队  编队  作战  10  任务  美国  导弹  能力  20  2016  军事  无人机  装备  进行  记者  我们  军队  安全  保障  12  战略  军人  日本  南海  战机
<class 'str'>
['航母', '训练', '海军', '中国', '官兵', '部队', '编队', '作战', '10', '任务', '美国', '导弹', '能力', '20', '2016', '军事', '无人机', '装备', '进行', '记者', '我们', '军队', '安全', '保障', '12', '战略', '军人', '日本', '南海', '战机']
[('航母', 0.029717671501934648), ('训练', 0.02306282002508911), ('海军', 0.02304905326258784), ('中国', 0.021705707424662282), ('官兵', 0.020714054773527862), ('部队', 0.017977518839620097), ('编队', 0.01709224782026588), ('作战', 0.016285806154310776), ('10', 0.016225203640217664), ('任务', 0.016034157059229306), ('美国', 0.015312370274718686), ('导弹', 0.013668419186279937), ('能力', 0.013338660582123523), ('20', 0.012643015823546232), ('2016', 0.012572776846748752), ('军事', 0.012387016321143234), ('无人机', 0.011436593442291188), ('装备', 0.011082255293207574), ('进行', 0.010876170074225427), ('记者', 0.010569761713443843), ('我们', 0.010547142074053708), ('军队', 0.010203907341118871), ('安全', 0.009893706779367024), ('保障', 0.009871814287039506), ('12', 0.009810043759381243), ('战略', 0.009632040383152404), ('军人', 0.009404418162943887), ('日本', 0.009372966442621053), ('南海', 0.009280110662492186), ('战机', 0.00914253019011132)]
--------------------------------------------------
TypeError        Traceback (most recent call last)
<ipython-input-9-19d8cc347df4> in <module>()
      9 print (analyse.extract_tags(content, topK=30, withWeight=False, allowPOS=()))
     10 print (analyse.extract_tags(content, topK=30, withWeight=True, allowPOS=()))
---> 11 print ("  ".join(analyse.extract_tags(content, topK=30, withWeight=True, allowPOS=())))

TypeError: sequence item 0: expected str instance, tuple found

文档3:3.chinese_text_classifier 

用机器学习方法完成中文文本分类

输入形态:

  • CountVectorizer
  • bow : bag of words
  • ti-idf : text features
  • word2vec : cbow/skip-gram (单个维度没有物理含义)

传统机器学习模型:

  • Naive Bayes
  • SVM
  • RF
  • GBDT

深度学习模型:

  • MLP
  • CNN
  • LSTM


代码1去停用词,并加标签

def preprocess_text(content_lines, sentences, category):
    for line in content_lines:
        try:
            segs=jieba.lcut(line)
            segs = filter(lambda x:len(x)>1, segs)
            segs = filter(lambda x:x not in stopwords, segs)
            sentences.append((" ".join(segs), category))
        except Exception,e:
            print line
            continue 


#生成训练数据
sentences = []
preprocess_text(technology, sentences, 'technology')

猜你喜欢

转载自blog.csdn.net/m0_37870649/article/details/80988102
今日推荐