• 《python自然语言处理》第三章 加工原料文本


    本章解决的问题:

    1. 编写程序访问本地和网络上的文件(后的语言材料)

    2.把文档分割成单独的词和标点符号(加工原料文本)

    3.编写程序产生格式化的输出,把结果保存在一个文件中

    NLP的流程

    图处理流程:

    打开一个URL,读里面HTML格式的内容,去除标记,并选择字符的切片,然后分词,是否转换为nltk.Text对象是可选择的。我们也可以将所有词汇小写并提取词汇表。
    在这条流程后面还有很多操作。要正确理解它,这样有助于明确其中提到的每个变量的类型。使用type(x)我们可以找出任一Python对象x的类型,如type(1)是<int>因为1是一个整数。
    当我们载入一个URL或文件的内容时,或者当我们去掉HTML标记时,我们正在处理字符串,也就是Python的<str>数据类型:

    >>>raw=open('document.txt').read()>>>type(raw)
    <type'str'>

    当我们将一个字符串分词,会产生一个(词的)链表,这是Python的<list>类型。规范化和排序链表产生其它链表:

    >>>tokens=nltk.word_tokenize(raw)>>>type(tokens)
    <type'list'>
    >>>words=[w.lower()forwintokens]>>>type(words)
    <type'list'>
    >>>vocab=sorted(set(words))>>>type(vocab)
    <type'list'>

    导入的包:

    from __future__ import division
    import nltk, re, pprint

    从网络上读取文本

    from urllib.request import urlopen
    
    url = r'http://www.gutenberg.org/files/24272/24272-0.txt'
    
    raw = urlopen(url).read()
    
    raw = raw.decode('utf-8')
    
    print(raw)

    #此时 type(raw) 是 <type'str'>

    分词

    #
    tokens = nltk.word_tokenize(raw)

    #此时 type(tokens) 为 <type'list'>

    text=nltk.Text(tokens)

    #此时 type(text) 为 <type'nltk.text.Text'> ,从这个链表创建一个NLTK文本,可以使用第一章语言处理方法

     处理HTML

    from bs4 import BeautifulSoup 
    url="http://baidu.com"
    
    html = urlopen(url).read()
    
    raw = BeautifulSoup(html)
    
    # 会将HTML文档中的所有标签清除,返回一个只包含文字的字符串
    print(raw.get_text)
    
    # 按照标准缩进格式输出
    print(raw.prettify())

    使用UNICODE进行文字处理

    。。。

    使用正则表达式检测词组搭配

    在Python中使用正则表达式,需要使用importre导入re函数库。还需要一个用于搜索的词汇链表;我们再次使用词汇语料库(2.4节),对它进行预处理消除某些名称。

    
    
    import re
    wordlist=[w for w in nltk.corpus.words.words('en')if w.islower()]

    # $美元符号 ,它是正则表达式中有特殊用途的符号,用来匹配单词的末尾
    [w for w in wordlist if re.search('ed$',w)]

    # 用空格分隔文本
    re.split(r' ',raw)

    # 遇到空白字符分开
    re.split(r's+',raw)

    # 遇到换行分开
    re.split(r'[ ]+',raw)

    词形归并

    使用nltk库WordNetLemmatizer词形归并

    对于任何一个 NLP 流水线,如果想要对相同语义词根的不同拼写形式都做出统一回复的话,那么词形归并工具就很有用,它会减少必须要回复的词的数目,即语言模型的维度。利用词形归并工具,可以让模型更一般化,当然也可能带来模型精确率的降低,因为它会对同一词根的不同拼写形式一视同仁。

    from nltk.stem import WordNetLemmatizer
    
    lemmatizer = WordNetLemmatizer()
    # 默认其为名词
    print(lemmatizer.lemmatize("better") )
    
    # 如果需要得到更精确的词元,需要告诉 WordNetLemmatizer 你感兴趣的词性是什么。
    print(lemmatizer.lemmatize("better", pos="a") )
    
    print(lemmatizer.lemmatize("goods", pos="n") )
    
    new_tokens = [nltk.WordNetLemmatizer().lemmatize(t)for t in tokens]

    对字符串的操作

    1.访问单个字符(索引)

    2.访问子字符串(切片)

    3.输出字符串

    4.更多操作

    读取本地文件

    #以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和标
    示符

    f=open('C:\Users\Yafang\Desktop\doc.txt') print(f.read()) for line in f: print(line.strip())#strip()方法删除输入行结尾的换行符

    如果文件放在这,就不用写路径

    f = open('document.txt')
    raw = f.read()
    print(raw)

    写回文件

    output_file = open('C:\Users\Yafang\Desktop\doc.txt','w')
    words = set(nltk.corpus.genesis.words('english-kjv.txt'))
    for word in sorted(words):
        output_file.write(word + "
    ")
  • 相关阅读:
    leetcode-滑动窗口
    leetcode刷题-双指针
    nlp
    机器学习
    tf-idf算法
    RNN和LSTM的理解
    DDD落地实践-战术实现心得
    DDD落地实践-战略设计心得
    测试平台系列(66) 数据驱动之基础Model
    Python小知识之对象的比较
  • 原文地址:https://www.cnblogs.com/lvjingyuan/p/14313069.html
Copyright © 2020-2023  润新知