"Vector palabra" entrenamiento con Word2Vec chino palabra vector (a) - el uso de perros de búsqueda de datos de noticias

Sogou noticias de conjunto de datos para entrenar la palabra vector Chino (Word2Vec), hágase un montón de tiempo a paso en el pozo, con la esperanza de desvíos todos compartan vamos.

Tras la finalización de este estudio, puede hacer clic en el entrenamiento de la palabra vector de Wikipedia para mejorar aún más su modelo de vector de palabra!

Artículo de referencia: Sogou corpus word2vec obtener la palabra vector de
Procesamiento del Lenguaje Natural de arranque (a) ------ formación Sogou procesamiento noticias corpus y word2vec palabra vector
word2vec Uso Resumen

Descargar conjunto de datos

El laboratorio utilizando un conjunto de datos de perros de búsqueda de noticias Descargar

Hay mini versión y la versión completa para elegir. He descargado la versión completa de tar.gz. formato.
Aquí Insertar imagen Descripción

Conjunto de Procesamiento de Datos

documentos de extracción (A)

Abra la línea de comandos de Windows (cmd), vaya al archivo de documento se encuentra, entre:

tar -zvxf news_sohusite_xml.full.tar.gz

Puede descargar archivos bajo news_sohusite_xml.full.tar.gz descompresión es news_sohusite_xml.dat

extracto de Documentación (B)

Nos fijamos en los datos (porque los datos son demasiado grandes, abrí con PyCharm) Después de extraer
Aquí Insertar imagen Descripción
encontró dos puntos clave : (1) documento que codifica un problema, lo necesitamos para transcodificar (2) Formato de almacenamiento de documentos es UML , url es enlaces de la página, contenttitle es el título de la página, el contenido es el contenido de la página, se puede obtener información de acuerdo a sus necesidades.

El uso de cmd , re-extracción "proceso durante la transcodificación de contenido Contenido" en:

type news_sohusite_xml.dat | iconv -f gbk -t utf-8 -c | findstr "<content>"  > corpus.txt 

Esta vez puede ser error, debido a la falta iconv.exe , es necesario descargar win_iconv - codificación de herramientas de conversión , descarga descomprimir, copiar iconv.exe a C: \ Windows \ System32, se puede utilizar.

Almacenado en el documento corpus.txt , el efecto como se muestra en la figura.
Aquí Insertar imagen Descripción

(C) el documento de Word

Establecer corpusSegDone.txt archivo como consecuencia de la palabra guardar el archivo. Introduzca el siguiente código de palabra, cada línea en el proceso de impresión 100 una vez, se puede ver el progreso.

import jieba
import re

filePath = 'corpus.txt'
fileSegWordDonePath = 'corpusSegDone.txt'

# 将每一行文本依次存放到一个列表
fileTrainRead = []
with open(filePath, encoding='utf-8') as fileTrainRaw:
    for line in fileTrainRaw:
        fileTrainRead.append(line)

# 去除标点符号
fileTrainClean = []
remove_chars = '[·’!"#$%&\'()*+,-./:;<=>?@,。?★、…【】《》?“”‘’![\\]^_`{|}~]+'
for i in range(len(fileTrainRead)):
    string = re.sub(remove_chars, "", fileTrainRead[i])
    fileTrainClean.append(string)

# 用jieba进行分词
fileTrainSeg = []
file_userDict = 'dict.txt'  # 自定义的词典
jieba.load_userdict(file_userDict)
for i in range(len(fileTrainClean)):
    fileTrainSeg.append([' '.join(jieba.cut(fileTrainClean[i][7:-7], cut_all=False))])  # 7和-7作用是过滤掉<content>标签,可能要根据自己的做出调整
    if i % 100 == 0:  # 每处理100个就打印一次
        print(i)

with open(fileSegWordDonePath, 'wb') as fW:
    for i in range(len(fileTrainSeg)):
        fW.write(fileTrainSeg[i][0].encode('utf-8'))
        fW.write('\n'.encode("utf-8"))


procedimiento de segmentación se muestra a continuación, un total de I 140W fila, con tiempo de 45 min.
Aquí Insertar imagen Descripción
Los resultados mostrados en la figura palabra:
Aquí Insertar imagen Descripción

Con el entrenamiento de la palabra vector de gensim

La mayor parte de las observaciones formuladas, que dependerá directamente del código:

import logging
import sys
import gensim.models as word2vec
from gensim.models.word2vec import LineSentence, logger


def train_word2vec(dataset_path, out_vector):
    # 设置输出日志
    logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
    logger.info("running %s" % ' '.join(sys.argv))
    # 把语料变成句子集合
    sentences = LineSentence(dataset_path)
    # 训练word2vec模型(size为向量维度,window为词向量上下文最大距离,min_count需要计算词向量的最小词频)
    model = word2vec.Word2Vec(sentences, size=100, sg=1, window=5, min_count=5, workers=4, iter=5)
    # (iter随机梯度下降法中迭代的最大次数,sg为1是Skip-Gram模型)
    # 保存word2vec模型(创建临时文件以便以后增量训练)
    model.save("word2vec.model")
    model.wv.save_word2vec_format(out_vector, binary=False)


# 加载模型
def load_word2vec_model(w2v_path):
    model = word2vec.KeyedVectors.load_word2vec_format(w2v_path, binary=True)
    return model


# 计算词语的相似词
def calculate_most_similar(model, word):
    similar_words = model.most_similar(word)
    print(word)
    for term in similar_words:
        print(term[0], term[1])


if __name__ == '__main__':
    dataset_path = "corpusSegDone.txt"
    out_vector = 'corpusSegDone.vector'
    train_word2vec(dataset_path, out_vector)


Pero sé que no será tan sencillo. Hice el primer aviso:
Aquí Insertar imagen Descripción

UserWarning: extensión C no se ha cargado, el entrenamiento será lenta.

No vi el principio, los resultados sólo pueden manejar a la parte posterior de una época 160 palabra / s, y por lo general cientos de miles, he entrenado para un total de 10 horas en vano! ! ! Realmente muy lento ::> _ <::

Después de revisar la información, he aprendido que la falta de extensiones en C, hay tres soluciones:

  • Usted mismo la instalación, necesita Visual Studio ver este blogger

  • Con Conda la instalación, se une automáticamente el compilador de C ver este blogger

  • Desinstalación versión superior de gensim paquete, instalar la versión 3.7.1, yo uso esto, más rápido.

# 首先打开cmd,卸载gensim

pip uninstall gensim

#接着安装3.7.1版本

pip install gensim==3.7.1

Correr de nuevo, no se mostrará esta advertencia, sino una advertencia para cambiarlo! Muy potente O__O "
Aquí Insertar imagen Descripción

UserWarning: Esta función está obsoleta, utilice smart_open.open lugar. Ver las notas de migración de datos: 点击这里

Abriendo el enlace, se encontró smart_open - Herramienta de Python para la transferencia de grandes archivos de transmisión. Hablamos de un lado, podríamos echar un vistazo a la tasa actual de procesamiento de la palabra, llegó a sus 30 w / s, con decir un mono procedimiento extranjero, "Ahora el programa se está ejecutando dentro de segundos que hizo un cambio drástico en el tiempo de ejecución. "
Aquí Insertar imagen Descripción
mirar hacia atrás smart_open , Open () para hacer que puede hacer, pero también puede reducir el código escrito y producido menos errores. Pip pueden instalar smart_open, el uso smart_open.open al abrir archivos de gran tamaño () puede ser.

Al utilizar 1h 30min, era "word2vec.model" modelo de
Aquí Insertar imagen Descripción
código de la formación comentado, se ejecuta el código para cargar el modelo:

# 加载模型
def load_word2vec_model(w2v_path):
    model = word2vec.Word2Vec.load(w2v_path)
    return model

model = load_word2vec_model("word2vec.model")  # 加载模型

Utilice el siguiente código calcula la palabra más cercana con "China":

def calculate_most_similar(self, word):
    similar_words = self.wv.most_similar(word)
    print(word)
    for term in similar_words:
        print(term[0], term[1])

model = load_word2vec_model("word2vec.model")
calculate_most_similar(model, "中国")

Los resultados son los siguientes :( parece bien)
Aquí Insertar imagen Descripción
similar a la de un hombre O_o
Aquí Insertar imagen Descripción

El vector puede imprimir la palabra:

print(model['男人'])

Aquí Insertar imagen Descripción
Identificar las mayoría de las palabras fuera de lo normal:

# 找出不合群的词
def find_word_dismatch(self, list):
    print(self.wv.doesnt_match(list))

list = ["早饭", "吃饭", "恰饭", "嘻哈"]
find_word_dismatch(model, list)

Aquí Insertar imagen Descripción
código completo:

import logging
import sys
import gensim.models as word2vec
from gensim.models.word2vec import LineSentence, logger
# import smart_open


def train_word2vec(dataset_path, out_vector):
    # 设置输出日志
    logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
    logger.info("running %s" % ' '.join(sys.argv))
    # 把语料变成句子集合
    sentences = LineSentence(dataset_path)
    # sentences = LineSentence(smart_open.open(dataset_path, encoding='utf-8'))  # 或者用smart_open打开
    # 训练word2vec模型(size为向量维度,window为词向量上下文最大距离,min_count需要计算词向量的最小词频)
    model = word2vec.Word2Vec(sentences, size=100, sg=1, window=5, min_count=5, workers=4, iter=5)
    # (iter随机梯度下降法中迭代的最大次数,sg为1是Skip-Gram模型)
    # 保存word2vec模型
    model.save("word2vec.model")
    model.wv.save_word2vec_format(out_vector, binary=False)


# 加载模型
def load_word2vec_model(w2v_path):
    model = word2vec.Word2Vec.load(w2v_path)
    return model


# 计算词语最相似的词
def calculate_most_similar(self, word):
    similar_words = self.wv.most_similar(word)
    print(word)
    for term in similar_words:
        print(term[0], term[1])


# 计算两个词相似度
def calculate_words_similar(model, word1, word2):
    print(model.similarity(word1, word2))


# 找出不合群的词
def find_word_dismatch(self, list):
    print(self.wv.doesnt_match(list))


if __name__ == '__main__':
    dataset_path = "corpusSegDone.txt"
    out_vector = 'corpusSegDone.vector'
    train_word2vec(dataset_path, out_vector)  # 训练模型
    model = load_word2vec_model("word2vec.model")  # 加载模型

    # calculate_most_similar(model, "吃饭")  # 找相近词

    # calculate_words_similar(model, "男人", "女人")  # 两个词相似度

    # print(model.wv.__getitem__('男人'))  # 词向量

    # list = ["早饭", "吃饭", "恰饭", "嘻哈"]

    # find_word_dismatch(model, list)

\ ^ O ^ / finalmente terminado! ¿Qué problemas pueden dejar un mensaje, voy a tratar de respuesta! └ (^ o ^) ┘ hay algo mal, pero también se ven exposiciones!

Bienvenido volver a ver el siguiente: con la formación corpus Wikipedia palabra china del vector

Artículo de referencia

Una vez más gracias a los tres artículos, ahorré este platos de pollo!

Artículo de referencia: Sogou corpus word2vec obtener la palabra vector de
Procesamiento del Lenguaje Natural de arranque (a) ------ formación Sogou procesamiento noticias corpus y word2vec palabra vector
word2vec Uso Resumen

Publicado ocho artículos originales · ganado elogios 0 · Vistas 623

Supongo que te gusta

Origin blog.csdn.net/qq_42491242/article/details/104782989
Recomendado
Clasificación