【火炉炼AI】机器学习037-NLP文本分块

栏目: 数据库 · 发布时间: 6年前

内容简介:(本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2, NLTK 3.3)文本分块是将一大段文本分割成几段小文本,其目的是比如想获取一段文本中的一小部分,或分割得到固定单词数目的小部分等,经常用于非常大的文本。注意文本分块和分词不一样,分词的目的是把一段文本分割成单词,而文本分块的目的是把一大段文本分割成多个小段文本。在不用的应用中,可能需要按照不同的规则对大段文本进行分块,此处我们需要得到单词数相等的块

(本文所使用的 Python 库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2, NLTK 3.3)

文本分块是将一大段文本分割成几段小文本,其目的是比如想获取一段文本中的一小部分,或分割得到固定单词数目的小部分等,经常用于非常大的文本。注意文本分块和分词不一样,分词的目的是把一段文本分割成单词,而文本分块的目的是把一大段文本分割成多个小段文本。

1. NLP文本分块

在不用的应用中,可能需要按照不同的规则对大段文本进行分块,此处我们需要得到单词数相等的块,故而可以编写函数来实现这种规则的分块。代码如下。

from nltk.tokenize import word_tokenize
def split(dataset,words_num):
    '''
    将dataset这一整段文本分割成N个小块,
    使得每个小块中含有单词的数目等于words_num'''
    words=dataset.split(' ') # 此处用空格来区分单词是否合适?
    # words=word_tokenize(dataset) # 用分词器来分词是否更合适一些?
    
    rows=int(np.ceil(len(words)/words_num)) # 即行数
    result=[] # 预计里面装的元素是rows行words_num列,最后一行可能少于words_num,故不能用np.array

    # words是list,可以用切片的方式获取
    for row in range(rows):
        result.append(words[row*words_num:(row+1)*words_num])
    return result

复制代码

然后用简·奥斯丁的《爱玛》中的文本作为数据集,由于这个数据集太大,长度有192427,故而我们此处只获取前面的1000个单词做测试。

# 测试一下
# 数据集暂时用简·奥斯丁的《爱玛》中的文本
dataset=nltk.corpus.gutenberg.words('austen-emma.txt')
print(len(dataset)) # 192427 代表读入正常
result=split(" ".join(dataset)[:1000], 30) # 只取前面的1000个单词,每30个单词分一个块,一共有34个块
print(result[0])
print(len(result[0]))
print(result[-1])
print(len(result[-1]))
复制代码

-------------------------------------输---------出--------------------------------

192427 ['[', 'Emma', 'by', 'Jane', 'Austen', '1816', ']', 'VOLUME', 'I', 'CHAPTER', 'I', 'Emma', 'Woodhouse', ',', 'handsome', ',', 'clever', ',', 'and', 'rich', ',', 'with', 'a', 'comfortable', 'home', 'and', 'happy', 'disposition', ',', 'seemed'] 30 ['more', 'the', 'intimacy', 'of', 'sisters', '.', 'Even', 'before', 'Miss', 'Taylor', 'had', 'ceased', 'to', 'hold', 'the', 'nominal', 'office', 'of', 'gover'] 19

--------------------------------------------完-------------------------------------

可以看出split之后的第一个元素长度是30,而最后一个元素的长度是19,并且split函数准确的将文本进行了分块。

########################小**********结###############################

1,本例中文本分块貌似没有用到NLTK模块中的任何函数,只用python字符串处理函数就可以。但在其他应用场景中,可能会需要更复杂的函数来完成特定的分块功能。

2,本例中使用空格来区分一个单词,这种分词方式并不一定准确,可以使用前面讲到的word_tokenize函数来分词,可能更准确一些。

3,如果是中文的分块,可以先用jieba对文本进行分词,然后在获取特定的单词数来进行文本分块,仿照上面的split函数很容易扩展到中文方面,此处省略。

#################################################################

注:本部分代码已经全部上传到( 我的github )上,欢迎下载。

参考资料:

1, Python机器学习经典实例,Prateek Joshi著,陶俊杰,陈小莉译


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Dream Machine

The Dream Machine

M. Mitchell Waldrop / Penguin Books / 2002-8 / USD 16.00

While most people may not be familiar with the name J. C. R. Licklider, he was the guiding spirit behind the greatest revolution of the modern era. At a time when most computers were big, ponderous ma......一起来看看 《The Dream Machine》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具