中文文本清洗、分词、训练词向量

中文文本在训练词向量的相关操作和使用的函数工具总结

只保留中文字符(数字、字母)

判断汉字、数字和字母的函数

#是否是汉语判读    
def is_chinese(uchar):
 """判断一个unicode是否是汉字"""
 if uchar >= u'\u4e00' and uchar <= u'\u9fa5':
  return True
 else:
  return False
#是否是数字判断
def is_number(uchar):
 """判断一个unicode是否是数字"""
    if uchar >= u'\u0030' and uchar <= u'\u0039':
        return True
    else:
        return False
#是否是英文字符判断
def is_alphabet(uchar):
 """判断一个unicode是否是英文字母"""
    if (uchar >= u'\u0041' and uchar <= u'\u005a') or (uchar >= u'\u0061' and uchar <= u'\u007a'):
        return True
    else:
        return False

使用上述三种函数可以实现对字符串进行筛选的处理,该函数输入待处理的字符串,返回清洗后的字符串

def format_str(content):
    content_str = ''
    for i in content:
        if is_chinese(i):#or is_number(i) or is_alphabet(i):
            content_str = content_str+i
    return content_str

分词去停用词

cut_word传入一个文档,文档中每个句子占一行,输出是分词并且去除停用词之后的文档

def stopwordslist(filepath):
    stopwords = [line.strip() for line in open(filepath, 'rb').readlines()]
    return stopwords
 
def cut_word():

    stop_words = stopwordslist(stop_word_path)
    corpus = ''
    temp = 0
    with open("./word2vec_data.txt",'r',encoding='utf-8') as f:
        documents = f.readlines()
    for document in tqdm(documents):
        document = document.replace("\n","")
        document_cut = jieba.cut(document, cut_all=False)
        # print('/'.join(document_cut))\
        result = ""
        for item in tqdm(document_cut):
            if(item not in stop_words):
                result += item;
        corpus += result+"\n"
          #  print(result)
    #分好词之后的数据
    with open('./corpus.txt', 'w+', encoding='utf-8') as f:
        f.write(corpus)  # 读取的方式和写入的方式要一致

gensim中word2vec进行词向量训练

# -*- coding: utf-8 -*-
from gensim.models import word2vec
import logging
 
##训练word2vec模型
 
# 获取日志信息
logging.basicConfig(format='%(asctime)s:%(levelname)s:%(message)s', level=logging.INFO)
 
# 加载分词后的文本,使用的是Text8Corpus类
 
sentences = word2vec.Text8Corpus(r'./corpus.txt')
 
# 训练模型,部分参数如下
model = word2vec.Word2Vec(sentences, size=100, hs=1, min_count=1, window=3)
 
# 模型的预测
print('-----------------分割线----------------------------')
 
# 计算两个词向量的相似度
try:
    sim1 = model.similarity(u'中央企业', u'事业单位')
    sim2 = model.similarity(u'教育网', u'新闻网')
except KeyError:
    sim1 = 0
    sim2 = 0
print(u'中央企业 和 事业单位 的相似度为 ', sim1)
print(u'人民教育网 和 新闻网 的相似度为 ', sim2)
 
print('-----------------分割线---------------------------')
# 与某个词(李达康)最相近的3个字的词
print(u'与国资委最相近的3个字的词')
req_count = 5
for key in model.similar_by_word(u'国资委', topn=100):
    if len(key[0]) == 3:
        req_count -= 1
        print(key[0], key[1])
        if req_count == 0:
            break
 
print('-----------------分割线---------------------------')
# 计算某个词(侯亮平)的相关列表
try:
    sim3 = model.most_similar(u'新华社', topn=20)
    print(u'和 新华社 与相关的词有:\n')
    for key in sim3:
        print(key[0], key[1])
except:
    print(' error')
 
print('-----------------分割线---------------------------')
# 找出不同类的词
sim4 = model.doesnt_match(u'新华社 人民教育出版社 人民邮电出版社 国务院'.split())
print(u'新华社 人民教育出版社 人民邮电出版社 国务院')
print(u'上述中不同类的名词', sim4)
 
print('-----------------分割线---------------------------')
# 保留模型,方便重用
model.save(u'word2vec.model')
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容