nltk-构建和使用语料库-可用于小说的推荐-完整实例

转载 2015年11月19日 10:59:40

步骤1:构建语料库:

#!/usr/bin/env python
#-*-coding=utf-8-*-
 
 
#数据源目录(二级目录)
sourceDataDir='data'
 
#数据源文件列表
fileLists = []
 
import os
from gensim import corpora, models, similarities
             
def getSourceFileLists(sourceDataDir):  
    fileLists = []
    subDirList = os.listdir(sourceDataDir)
    for subDir in subDirList:
        subList = os.listdir(sourceDataDir + '/' + subDir)
        fileList = [ sourceDataDir+'/'+subDir+'/'+ x for x in subList if os.path.isfile(sourceDataDir+'/'+subDir+'/'+x)]
        fileLists += fileList
 
    return  fileLists   
         
         
fileLists = getSourceFileLists(sourceDataDir)  
   
   
if 0 < len(fileLists): 
    import codecs
    import jieba
    punctuations = ['','\n','\t',',', '.', ':', ';', '?', '(', ')', '[', ']', '&', '!', '*', '@', '#', '$', '%'] 
     
    if not os.path.exists('dict'):
        os.mkdir("dict") 
    if not os.path.exists('corpus'):
        os.mkdir("corpus") 
 
    for fileName in fileLists:
        print fileName
 
        hFile = None
        content = None
        try:
            hFile = codecs.open(fileName,'r','gb18030')
            content = hFile.readlines()
        except Exception,e:
            print e
        finally:
            if hFile:
                hFile.close()
         
        if content:
            fileFenci = [ x for x in jieba.cut(' '.join(content),cut_all=True)]
            fileFenci2 = [word for word in fileFenci if not word in punctuations]  
             
            texts = [fileFenci2]
 
            all_tokens = sum(texts, [])
            tokens_once = set(word for word in set(all_tokens) if all_tokens.count(word) == 1)
            texts = [[word for word in text if word not in tokens_once] for text in texts]
 
            sFileDir, sFileName = os.path.split(fileName)
            dictFileName = 'dict/'+sFileName+'.dict'
            corpusFileName = 'corpus/'+sFileName+'.mm'
             
            dictionary = corpora.Dictionary(texts)
            dictionary.save_as_text(dictFileName)
 
            corpus = ([dictionary.doc2bow(text) for text in texts])
            corpora.MmCorpus.serialize(corpusFileName, corpus) 
 
print 'Build corpus done'

数据源:

来自 http://d1.txthj.com/newrar/txthj_264.rar 的83篇小说,将其目录存放在目录 ./data/下。

加载时作为二层目录处理

输出:

./dict 和 ./corpus

在对应目录下生成 xxx.dict 和 xxx.mm,xxx为原文件的全称(不包括路径,包括后缀)


步骤2:加载语料库,相似性分析

#!/usr/bin/env python
#-*-coding=utf-8-*-
 
 
import os
from gensim import corpora, models, similarities
             
def getFileList(dir):            
    return [ dir + x for x in os.listdir(dir)]
dictLists =  getFileList('./dict/')
  
 
class LoadDictionary(object):
    def __init__(self, dictionary):
        self.dictionary = dictionary
 
    def __iter__(self):
        for dictFile in dictLists:
            sFileRaw, sFilePostfix = os.path.splitext(dictFile)
            sFileDir, sFileName = os.path.split(sFileRaw)
            (dictFile, corpusFile) = ( './dict/' + sFileName + '.dict',  './corpus/'+sFileName + '.mm')
            yield self.dictionary.load_from_text(dictFile)
             
class LoadCorpus(object):
 
    def __iter__(self):
        for dictFile in dictLists:
            sFileRaw, sFilePostfix = os.path.splitext(dictFile)
            sFileDir, sFileName = os.path.split(sFileRaw)
            (dictFile, corpusFile) = ( './dict/' + sFileName + '.dict',  './corpus/'+sFileName + '.mm')
            yield corpora.MmCorpus(corpusFile)
             
   
"""
    预处理(easy_install nltk)
"""
#简化的 中文+英文 预处理
def pre_process_cn(inputs, low_freq_filter = True):
    """
        1.去掉停用词
        2.去掉标点符号
        3.处理为词干
        4.去掉低频词
 
    """
    import nltk
    import jieba.analyse
    from nltk.tokenize import word_tokenize
     
    texts_tokenized = []
    for document in inputs:
        texts_tokenized_tmp = []
        for word in word_tokenize(document):
            texts_tokenized_tmp += jieba.analyse.extract_tags(word,10)
        texts_tokenized.append(texts_tokenized_tmp)    
     
    texts_filtered_stopwords = texts_tokenized
 
    #去除标点符号
    english_punctuations = [',', '.', ':', ';', '?', '(', ')', '[', ']', '&', '!', '*', '@', '#', '$', '%']
    texts_filtered = [[word for word in document if not word in english_punctuations] for document in texts_filtered_stopwords]
 
    #词干化
    from nltk.stem.lancaster import LancasterStemmer
    st = LancasterStemmer()
    texts_stemmed = [[st.stem(word) for word in docment] for docment in texts_filtered]
     
    #去除过低频词
    if low_freq_filter:
        all_stems = sum(texts_stemmed, [])
        stems_once = set(stem for stem in set(all_stems) if all_stems.count(stem) == 1)
        texts = [[stem for stem in text if stem not in stems_once] for text in texts_stemmed]
    else:
        texts = texts_stemmed
    return texts
 
dictionary = corpora.dictionary.Dictionary()
dictionary_memory_friendly = LoadDictionary(dictionary)
for vector in dictionary_memory_friendly: 
    dictionary = vector
 
corpus = []
corpus_memory_friendly = LoadCorpus()
for vector in corpus_memory_friendly: 
    corpus.append(vector[0])
     
if 0 < len(corpus):
    tfidf = models.TfidfModel(corpus)
    corpus_tfidf = tfidf[corpus]
 
    model = models.LsiModel(corpus_tfidf, id2word=None, num_topics=20,  chunksize=2000000) #不指定 id2word=dictionary 时,LsiModel内部会根据 corpus 重建 dictionary
    index = similarities.Similarity('./novel_', model[corpus], num_features=len(corpus)) 
 
    #要处理的对象登场,这里随便从小说中截取了一段话
    target_courses = ['男人们的脸上沉重而冷凝,蒙着面纱的女人们则是发出断断续续的哭泣声,他们无比专注地看着前方,见证一场生与死的拉锯战。']
    target_text = pre_process_cn(target_courses, low_freq_filter=False)
 
    """
    对具体对象相似度匹配
    """
    #选择一个基准数据
    ml_course = target_text[0]
    #词袋处理
    ml_bow = dictionary.doc2bow(ml_course)   
 
    #在上面选择的模型数据 lsi model 中,计算其他数据与其的相似度
    ml_lsi = model[ml_bow]     #ml_lsi 形式如 (topic_id, topic_value)
    sims = index[ml_lsi]     #sims 是最终结果了, index[xxx] 调用内置方法 __getitem__() 来计算ml_lsi
 
    #排序,为输出方便
    sort_sims = sorted(enumerate(sims), key=lambda item: -item[1])
 
    #查看结果
    print sort_sims[0:10]   
    print len(dictLists)
    print dictLists[sort_sims[1][0]] 
    print dictLists[sort_sims[2][0]] 
    print dictLists[sort_sims[3][0]]

说明:

yield的使用是为了更好的内存效率。


遗留问题:

    步骤2会有提示:

     /usr/lib/python2.7/dist-packages/scipy/sparse/compressed.py:122: UserWarning: indices array has non-integer dtype (float64)

    不影响处理过程


举报

相关文章推荐

nltk(4)——加工原始语料库

加工原始语料库 分词 做自然语言处理,一定离不开数据资源,即对数据资源的分析,了解其中潜在的内容。 网络上存在众多的资源,如文本,网页等等。这次写的主要是文本和网页。 1、我们要使用程序获...

文本分析--NLTK语料库选择

# -*-coding:utf-8-*-""" from nltk.book import * 获取所有的语料库 """""" 古滕堡语料库 """ # from ...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

Python nltk载入自己的中文语料库的两种方法 for Windows7

前提:把自己的语料库(sogou文本分类语料库)放在LTK_DATA/corpora/目录下; 然后在命令行输入以下之后,即可看到所有的txt文件名列表了。 第一种方法:BracketParseCo...

nltk-构建和使用语料库-可用于小说的推荐-完整实例

步骤1:构建语料库: [python] view plain copy #!/usr/bin/env python   #-*-coding=ut...

用nltk colocation功能抽取中文短语和专业词汇增加分词准确性

#用nltk+jieba发现连词和三连词。 import jieba import nltk from nltk.collocations import * train_corpus = "测...

python中文语音识别后-结巴分词以及停用词过滤时遇到的转码问题

首先自己建立了一个停用词表,表中有各种符号,没有查询意义的中文词,以及英文词,在语音识别系统运行过程中,始终都维护着一个停用词表,但是在对结巴分词后的词进行过滤的时候出现了编码不一致的情况导致无意义词...

Python中文分词 jieba 十五分钟入门与进阶

整体介绍jieba 基于Python的中文分词工具,安装使用非常方便,直接pip即可,2/3都可以,功能强悍,博主十分推荐 github:https://github.com/fxsjy/jieba...

python 结巴分词(jieba)学习

源码下载的地址:https://github.com/fxsjy/jieba 演示地址:http://jiebademo.ap01.aws.af.cm/ 特点 1,支持三种分词模式:...

python nltk 统计语料的词性标注分布

import nltk sent='消息/n 源/g 新浪/nz 财经/n 称/v ,/w 针对/p 今日/t 有/v 媒体/n 平台/n 报道/v 央行/n 已经/d 发文/v 暂停/v 比特/q ...

nltk应用

摘要 对比于《nltk-比较英文文档相似度-完整实例》 nltk同时也能处理中文的场景,只要做如下改动: 使用中文分词器(如我选用了结巴分词) 对中文字符做编码处理,使用unicode编码方...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)