特征提取
1. 基本文本处理技能
1.1 分词的概念(分词的正向最大、逆向最大、双向最大匹配法)
参考:https://www.cnblogs.com/xuelisheng/p/9712973.html
1.2 词、字符频率统计;(可以使用Python中的collections.Counter模块)
字符频率统计:
from collections import Counter
demo = '我爱自然语言处理。自然语言处理是一个很有意思的研究领域'
count = Counter(demo)
print(count)
输出结果:Counter({‘言’: 2, ‘自’: 2, ‘然’: 2, ‘理’: 2, ‘语’: 2, ‘处’: 2, ‘的’: 1, ‘。’: 1, ‘研’: 1, ‘爱’: 1, ‘很’: 1, ‘领’: 1, ‘是’: 1, ‘究’: 1, ‘有’: 1, ‘意’: 1, ‘我’: 1, ‘个’: 1, ‘域’: 1, ‘思’: 1, ‘一’: 1})
词频统计相比字符统计而言,只是多了一步分词的过程,具体代码如下所示:
import jieba
from collections import Counter
with open(r'C:\Users\Administrator\Desktop\文章.txt', 'r') as f:
xianni = f.read().strip()
xianni_words = [x for x in jieba.cut(xianni) if len(x) >= 2] # 将全文分割,并将大于两个字的词语放入列表
c = Counter(xianni_words).most_common(10) # 取最多的10组
print(c)
2.
2.1 语言模型中unigram、bigram、trigram的概念
unigram :一元分词,把句子分成一个一个的汉字
bigram: 二元分词,把句子从头到尾每两个字组成一个词语
trigram :三元分词,把句子从头到尾每三个字组成一个词语.
2.2 unigram、bigram频率统计;(可以使用Python中的collections.Counter模块,也可以自己寻找其他好用的库)
unigram等同于词频统计,而bigram频率统计只需要取n-gram,然后传入到Counter()中即可。
3.文本矩阵化:要求采用词袋模型且是词级别的矩阵化
3.1分词
一般采用jieba分词,代码如下:
import jieba
# 全模式
text = "我来到这里组队学习自然语言处理"
seg_list = jieba.cut(text, cut_all=True)
print(u"[全模式]: ", "/ ".join(seg_list))
# 精确模式
seg_list = jieba.cut(text, cut_all=False)
print(u"[精确模式]: ", "/ ".join(seg_list))
# 默认是精确模式
seg_list = jieba.cut(text)
print(u"[默认模式]: ", "/ ".join(seg_list))
# 搜索引擎模式
seg_list = jieba.cut_for_search(text)
print(u"[搜索引擎模式]: ", "/ ".join(seg_list))
输出结果:
[全模式]: 我/ 来到/ 这里/ 组队/ 学习/ 自然/ 自然语言/ 语言/ 处理
[精确模式]: 我/ 来到/ 这里/ 组队/ 学习/ 自然语言/ 处理
[默认模式]: 我/ 来到/ 这里/ 组队/ 学习/ 自然语言/ 处理
[搜索引擎模式]: 我/ 来到/ 这里/ 组队/ 学习/ 自然/ 语言/ 自然语言/ 处理
3.2 去除停用词
去除停用词典和错词检错都可以用词典的形式完成,以停用词为例,可使用的是知网提供的中文停用词典。
代码参照:https://blog.csdn.net/m0_38126215/article/details/83787873
import jieba
#导入自定义词典
jieba.load_userdict('C:\Users\Administrator\Desktop\mydict.txt')
# 去除停用词
stopwords = {}.fromkeys(['的', '包括', '等', '是'])
text = "故宫的著名景点包括乾清宫、太和殿和午门等。其中乾清宫非常精美,午门是紫禁城的正门。"
# 精确模式
segs = jieba.cut(text, cut_all=False)
final = ''
for seg in segs:
if seg not in stopwords:
final += seg
print (final)
seg_list = jieba.cut(final, cut_all=False)
print ("/ ".join(seg_list))
3.3 构造词表
def build_vocab(train_dir, vocab_dir, vocab_size=5000):
"""根据训练集构建词汇表,存储"""
data_train, _ = read_file(train_dir)
all_data = []
for content in data_train:
all_data.extend(content)
counter = Counter(all_data)
count_pairs = counter.most_common(vocab_size - 1)
words, _ = list(zip(*count_pairs))
# 添加一个 <PAD> 来将所有文本pad为同一长度
words = ['<PAD>'] + list(words)
open_file(vocab_dir, mode='w').write('\n'.join(words) + '\n')
3.4 文本向量化
参考:https://blog.csdn.net/QFire/article/details/81071010
from gensim.corpora import WikiCorpus
import jieba
from langconv import *
def my_function():
space = ' '
i = 0
l = []
zhwiki_name = './data/zhwiki-latest-pages-articles.xml.bz2'
f = open('./data/reduce_zhiwiki.txt', 'w')
wiki = WikiCorpus(zhwiki_name, lemmatize=False, dictionary={})
for text in wiki.get_texts():
for temp_sentence in text:
temp_sentence = Converter('zh-hans').convert(temp_sentence)
seg_list = list(jieba.cut(temp_sentence))
for temp_term in seg_list:
l.append(temp_term)
f.write(space.join(l) + '\n')
l = []
i = i + 1
if (i %200 == 0):
print('Saved ' + str(i) + ' articles')
f.close()
if __name__ == '__main__':
my_function()