NLP 基础:分词,停词,n元语法

1. 分词

分词,英文称为 Tokenize,图片

1.1 中文分词主要工具

1.2 中文分词工具: jieba 分词

常用函数

  • jieba.cut(doc, cut_all=False, HMM=False)

  • jieba.add_word(word, freq=None, tag=None)jieba.del_word(word)

    • 在程序中动态修改词典。
  • jieba.set_dictionary(path)

    • 加载自定义词典

例子:精确模式(默认)cut_all=False 和全模型 cut_all=True

doc = "我来到北京清华大学"
seg_list = jieba.cut(doc, cut_all=False)
print("/ ".join(seg_list))  # 精确模式
# Output: 我/ 来到/ 北京/ 清华大学

seg_list = jieba.cut(doc, cut_all=True)
print("/ ".join(seg_list))  # 全模式
# Output: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学

例子: 自定义字典

doc = "李小福是创新办主任也是云计算方面的专家"
seg_list = jieba.cut(doc)
print( "/ ".join(seg_list)) 
# Output: 李小福/ 是/ 创新/ 办/ 主任/ 也/ 是/ 云/ 计算/ 方面/ 的/ 专家

jieba.add_word("创新办")
jieba.add_word("云计算")
seg_list = jieba.cut(doc)
print("/ ".join(seg_list))  
# Output: 李小福/ 是/ 创新办/ 主任/ 也/ 是/ 云计算/ 方面/ 的/ 专家

1.3 NLTK

word_tokenize()wordpunct_tokenize() 函数,website

import nltk
nltk.download('punkt')  # 分词所必要的数据

from nltk.tokenize import word_tokenize, wordpunct_tokenize
s = 'Good muffins cost $3.88\nin New York. Please buy me ... two of them.\n\nThanks.'
tokens_1 = word_tokenize(s)    # tokens
tokens_2 = wordpunct_tokenize(s)
print(tokens_1)
print(tokens_2)
# Output: ['Good', 'muffins', 'cost', '$', '3.88', 'in', 'New', 'York', '.', 'Please', 'buy', 'me', '...', 'two', 'of', 'them', '.', 'Thanks', '.']
# Output: ['Good', 'muffins', 'cost', '$', '3', '.', '88', 'in', 'New', 'York', '.', 'Please', 'buy', 'me', '...', 'two', 'of', 'them', '.', 'Thanks', '.']

2. 停词 Stop Words

2.1 停词表

  • 中文停词表

    • 中文常用停用词表,github
  • 英文停词表

2.2 在第三方库中

  • NLTK 库中
nltk.download('stopwords')

from nltk.corpus import stopwords
stop_words = set(stopwords.words('english'))
  • scikit-learn 库中
from sklearn.feature_extraction import text
stop_words = text.ENGLISH_STOP_WORDS

from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer(stop_words='english') # 启用 stop words
corpus = ['This is the first document']
stop_words = vectorizer.fit(corpus).get_stop_words()
print(stop_words)

过滤停词

NLTK 库中,没有可以直接过滤停词的函数。在得到 tokens 后,可以通过以下代码,过滤停词

filtered_tokens = [w for w in tokens if not w in stopwords.words()]

3. n元语法 n-gram

bigrams(), trigrams(), ngrams() 函数, website

主要参数:

  • sequence:list 类型,或 iter 类型;序列(tokens),
    • 当为 str 类型,则将每个字母当做一个词(token)
  • n:gram 的个数
  • pad_left, pad_right:bool 类型,默认为 False
  • left_pad_symbol, right_pad_symbol:str 类型 padding 的词,默认为 None

skipgrams() 跳元语法

主要参数:

  • n
  • k:跳元步长

例子:三元语法

from nltk.util import ngrams, trigrams, bigrams
tokens = "Insurgents killed in ongoing fighting".split()
# 3 元语法
trigrams_1 = ngrams(tokens, n=3, pad_left=True, left_pad_symbol='</s>')
trigrams_2 = trigrams(tokens, pad_left=True, left_pad_symbol='</s>')
# 输出
print(list(tokens))
print(list(trigrams_1))  # 得到的 trigrams_1 和 trigrams_2 相同
print(list(trigrams_2))

例子: 字符的三元法语

s = 'Good muffins cost $3.88\nin New York. Please buy me ... two of them.\n\nThanks.'
trigrams_1 = ngrams(s, n=3, pad_left=True)
trigrams_2 = trigrams(s, pad_left=True)
# 输出
print(list(trigrams_1))
print(list(trigrams_2))

例子: 跳元法语

from nltk.util import skipgrams
tokens = "Insurgents killed in ongoing fighting".split()
skipgrams1 = skipgrams(tokens, n=3, k=2)
# 输出
print(tokens)
print(list(skipgrams1))
posted @ 2022-05-19 15:37  veager  阅读(240)  评论(0)    收藏  举报