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)- 在程序中动态修改词典。
-
- 加载自定义词典
例子:精确模式(默认)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 停词表
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 类型,默认为 Falseleft_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))

浙公网安备 33010602011771号