Cómo se usa Python Gensim con Word2vect
El código original de word2vectors (word2vec) está escrito en C, también tiene una contraparte en Python y está integrado en un impresionante framework llamado gensim.
Utilizo estas funciones en mi proyecto de Web Semántica de código abierto, Graph-Mind (de hecho, también escribí mi propio juguete), y puedes usar directamente la encapsulación adicional que hice arriba para jugar con algunos. De estas operaciones, compartiré los métodos de llamada y algunas ideas de código a continuación.
1. Algunas variables miembro de la clase:
[python]?view Plain?copy
def?__init__(self,?modelPath,?_size=100, ?_window=5,?_minCount=1,?_workers=multiprocessing.cpu_count()):?
self.modelPath?=?modelPath?
self._size?=?_size ?
self._window?=?_window?
self._minCount?=?_minCount?
self._workers?=?_workers?
modelPath es el archivo de almacenamiento en disco del modelo de entrenamiento de word2vec (el modelo nunca se solidifica en la memoria), _size es la dimensión del vector de palabras, _window es el tamaño de la ventana de escaneo de contexto en la que se encuentra la palabra. se entrenará el vector y, finalmente, un desconocido, por lo que el valor predeterminado, _workers es la cantidad de procesos que se entrenarán (? Necesita una explicación más precisa, corríjame), y el valor predeterminado es la cantidad de núcleos de procesador del que se está ejecutando actualmente. máquina. Puedes recordar estos parámetros primero.
2. Inicialice y entrene el modelo word2vec por primera vez
La función principal para lograr este objetivo es initTrainWord2VecModel, que pasará dos parámetros: corpusFilePath y safe_model, que representan el entrenamiento respectivamente. La ruta al corpus y si se debe seleccionar "safe_model" para el entrenamiento inicial. Discutiremos este "modelo de seguridad" más adelante. Veamos primero el código:
[python]?view Plain?copy
def?initTrainWord2VecModel(self,?corpusFilePath,?safe_model=False):?
'''''?
init?and?train?a?new?w2v?model?
(corpusFilePath puede ser la ruta al archivo o directorio del corpus, o puede ser directamente Es un archivo y, a veces, puede ser una oración directamente)
acerca de?
Si safe_model es verdadero, se utilizará el método de actualización para actualizar el modelo. durante el proceso de formación.
Esto puede garantizar el uso seguro de la memoria del sistema operativo, pero es más lento.
Si safe_model es falso, el proceso de entrenamiento utiliza todas las
líneas del corpus cargadas en una lista de oraciones y entrenadas en ellas una vez.
)
'''?
extraSegOpt().reLoadEncoding()?
fileType?=?localFileOptUnit.checkFileState(corpusFilePath)?
if?fileType?==?u'error':?
warnings.warn('load?file?error!')?
return?
modelo = ninguno?
print('¿entrenamiento?modelo?de?singleFile!')?
modelo?=?Word2Vec(LineSentence(corpusFilePath),?size=self._size,?window=self._window,?min_count=self._minCount,?workers=self.._workers)? p>
elif?fileType?==?u'file':?
corpusFile?=?open(corpusFilePath,?u'r')?
print(' entrenamiento,modelo,de,singleFile!')?
model=?Word2Vec(LineSentence(corpusFile),?size=self._size,?window=self._window,?min_count=self._minCount,? Workers=self.workers)?
elif?fileType?==?u'directory':?
corpusFiles?=?localFileOptUnit.listAllFileInDirectory(corpusFilePath)?
print('¡modelo de entrenamiento de listFiles del directorio!')?
if?
model?=?Word2Vec(LineSentence(corpusFiles[0]),?size=self. _size,?window=self._window,?min_count=self._minCount,?workers=self.._workers)?
for?file?in?corpusFiles[1:len(corpusFiles)]:?
model=self.updateW2VModelUnit(modelo,?archivo)?
else:?
frases?=?self.loadSentencesFromFiles(corpusFiles)?
modelo?=?Word2Vec(frases,?size=self._size, ?window=self._window,?min_count=self._minCount,?workers=self._workers)?
elif?fileType?==?u'other':?
# ?TODO?agregar?sentencias?lista?directa?
¿pasar?
model.save(self.modelPath)?
model.init_sims()?
print('¿produciendo?word2vec?modelo?...? ?ok!')?
¿retorno?
En primer lugar, hay algunos elementos diversos. Es necesario determinar el tipo de resultado del acceso a la ruta del archivo de entrada de acuerdo con la respuesta del procesamiento de diferentes tipos de archivos. , esto debe ser legible. corpusFilePath es un objeto de archivo ya abierto, por ejemplo, el código para crear el modelo word2vec es:
[python]?view Plain?copy
model?= ?Word2Vec(LineSentence(corpusFilePath),?size= self._size,?window=self._window ,?min_count=self._minCount,?workers=self._workers)?
En realidad, es así de simple, pero En aras de la solidez del código, se vuelve igual que el anterior. Misma longitud. El problema es que frente a muchos documentos de capacitación y tiempos enormes en una ruta, la carga de memoria única puede no ser muy confiable (las personas que no han estudiado el constructor Word2Vec en gensim no han considerado este problema y simplemente están habitualmente alerta ), así que configuro un parámetro safe_model para determinar si activar el "modo seguro" durante el entrenamiento inicial, que es el llamado "modo seguro", lo que significa que inicialmente solo se carga una parte del corpus y los documentos de entrenamiento inicial posteriores. son incrementalmente Aprenda a actualizar al modelo original.
En el código anterior, corpusFilePath puede pasar un objeto de archivo abierto, o la dirección de un solo archivo, o la ruta de una carpeta, y el juicio de tipo se completa a través de la función checkFileState. Otra función es updateW2VModelUnit, que se utiliza para el entrenamiento incremental para actualizar el modelo de w2v, que se presentará en detalle a continuación. La función loadSetencesFromFiles se utiliza para cargar todas las oraciones en una carpeta en todo el corpus. Esto está disponible en el código fuente. No entraré en detalles.
3. Entrenamiento incremental para actualizar el modelo word2vec
El entrenamiento incremental del modelo w2v mencionado anteriormente es una de las razones para hacer esto: evitar cargar todo el corpus de entrenamiento de una vez. Memoria. Otra razón es hacer frente al hecho de que el corpus puede crecer en cualquier momento.
Por supuesto, gensim proporciona dicha solución, que se llama de la siguiente manera:
[python]?view Plain?copy
def?updateW2VModelUnit(self,?model,? corpusSingleFilePath):
''''''?
(¿Sólo un archivo)?
'''?
fileType=localFileOptUnit.checkFileState(corpusSingleFilePath)?
if?fileType?==?u'directorio':?
warnings.warn('¿no se puede? negociar?un?directorio!')?
return?model?
if?fileType?==?u'opened':?
trainedWordCount?=?model.train(LineSentence(corpusSingleFilePath))?
print('update.model, update.words.num is:?')?+?trainedWordCount)?
elif?
corpusSingleFile?=?open(corpusSingleFilePath ,?u'r')?
trainedWordCount?=?model.train(LineSentence(corpusSingleFile))?
print('update.model, update.words.num es: ?')?+?trainedWordCount)?
else:?
#"TODO "¿Agregar lista de oraciones directamente (igual que la función anterior)?
¿Aprobado?
¿Modelo de devolución?
Después de una breve comprobación del tipo de documento, el modelo se actualiza llamando al método train del objeto del modelo, al que se le pasan las frases del nuevo corpus y devuelve el número de palabras añadidas al modelo. Una vez que la función se ejecuta por completo, se devuelve el modelo actualizado. El código fuente tiene mejoras debajo de esta función que pueden manejar parámetros de archivos de múltiples clases (igual que 2), por lo que no entraremos en detalles aquí.
4. Varias consultas básicas
Cuando esté seguro de que el modelo ha sido entrenado y no se actualizará nuevamente, puede bloquear el modelo, es decir, precargar la matriz de similitud. para mejorar la velocidad de consulta posterior, pero su modelo solo puede leer a partir de ahora.
[python]?view Plain?copy
def?finishTrainModel(self,?modelFilePath=None):?
'''''? p>
advertencia: ¿después?
''''?
if modelFilePath == Ninguno:?
modelFilePath?=?self.modelPath?
model?=?self.loadModelfromFile(modelFilePath)?
model.init_sims(replace=True)?
Como puede ver, los llamados lock El método del modelo es init_sims y el parámetro de reemplazo está establecido en True.
Luego, existen algunos métodos de consulta para el modelo word2vec:
[python]?view Plain?copy
def getWordVec(self,?model,? wordStr) :?
'''''?
¿obtener?
¿regresar?
[python]?Ver copia simple
def?queryMostSimilarWordVec(self,?model,?wordStr,?topN=20):?
'''''?
MSimilar?words?basic ?consulta ?función?
return?2-dim?List?[0]?is?word?[1]?is?
similarPairList?=?model.most_similar(wordStr.decode('utf -8'),?topn=topN)?
return?similarPairList?
[python]?view Plain?copy
def?culSimBtwWordVecs(self, ?modelo,?palabraStr1,?palabraStr2):?
'''''?
dos,palabras,similar,básico,consulta,función,
retorno,doble problema,
'''?
similarValue=model.similarity(wordStr1.decode('utf-8'),?wordStr2.decode('utf-8 '))?
return?similarValue?
El método anterior es muy simple y básicamente se puede resolver en una línea. En el código fuente, las siguientes funciones aún admiten el modelo correspondiente. archivos. Funciones que manejan versiones. Entre ellos, getWordVec es obtener el vector de palabras en sí de la palabra de consulta word2vec e imprimir una matriz numérica pura; queryMostSimilarWordVec es obtener las N palabras con la mayor correlación con la palabra de consulta y sus correspondientes similitudes, y devuelve un valor de dos. lista dimensional (escrita en el comentario Es bastante claro); culSimBtwWordVecs obtiene el valor de similitud de dos palabras dadas y devuelve directamente un valor doble.
5. Calcular vectores de palabras de Word2Vec
Los niños que han estudiado la teoría de w2v deben saber que los vectores de palabras se pueden calcular mediante suma y resta. Gensim proporciona el método correspondiente en función de esta característica. La llamada es la siguiente:
[python]?view Plain?copy
def? queryMSimilarVecswithPosNeg(self,?model,?posWordStrList,?negWordStrList,?topN=20):?
''''''?
pos-neg?MSimilar?words?basic?consulta?función?
retorno?2-dim?List? [0]? es?palabra?[1]?es?
posWordList?[]?
negWordList?[]?
para?wordStr?in ?posWordStrList:?
posWordList.append(wordStr.decode('utf-8'))?
para?wordStr?in?negWordStrList:?
negWordList.append( wordStr.decode('utf-8'))?
pnSimilarPairList?=?model.most_similar(positive=posWordList,?negative=negWordList,?topn=topN)?
return ?pnSimilarPairList?
Dado que se utiliza py27, los datos de la lista de palabras entrantes se han codificado y filtrado de antemano. posWordList puede considerarse como el conjunto de palabras que contribuyen positivamente a los resultados, mientras que negWordList. es el conjunto de palabras que contribuyen positivamente a los resultados. El conjunto de palabras con contribuciones negativas se envía al método most_similar. Cuando se configura topN para devolver la respuesta, la forma del resultado devuelto es la misma que la función 4 queryMostSimilarWordVec. Puedo entender esta operación matemáticamente:
La siguiente operación es mi propia creación. Supongamos que quiero usar la forma de "correlación de palabras" del vector de palabras anterior topN para mostrar la correlación entre dos palabras o grupos de palabras. Esto es lo que hago:
[python ]?view Plain?copy
def?copeMSimilarVecsbtwWordLists(self ,?model,?wordStrList1,?wordStrList2,?topN_rev=20,?topN =20):?
''' ''?
rango de palabras vec res para dos listas de palabras desde el origen hasta el destino:
Utilice wordVector para expresar la relación entre src-wordList y tag-wordList,
Primero, use tag-wordList como neg-wordList para obtener rev-wordList,
Luego, use wordVector para expresar la relación entre src- wordList y tag-wordList,
Luego, use wordVector para expresar la relación entre src-wordList y tag-wordList.
Finalmente, use wordVector para expresar la relación entre src-wordList y lista de palabras-etiquetas.
Luego, use scr-wordList y rev-wordList como la nueva src-tag-wordList
topN_rev es el topN de rev-wordList, topN es el topN final de la relación vec
'''?
srcWordList =?[]?
tagWordList =?[]?
srcWordList.extend(wordStr. decode('utf-8')?
tagWordList.extend(wordStr.decode('utf-8')?for?wordStr?in?wordStrList2)?
revSimilarPairList?= ?self.queryMSimilarVecswithPosNeg(modelo,?[],?tagWordList,?topN_rev)?
revWordList?=?[]?
revWordList.extend(pair[0].decode( 'utf- 8')?for?pair?in?revSimilarPairList)?
stSimilarPairList?=?self.queryMSimilarVecswithPosNeg(model,?srcWordList,?revWordList,?topN)?
return?stSimilarPairList ?
La idea de esta operación es usar primero uno de los dos conjuntos de palabras como negWordList, pasarlo a la función queryMSimilarVecswithPosNeg anterior para obtener los N grupos principales de palabras de transición y luego use estas palabras de transición para comparar con las palabras originales. Realicemos juntos otro conjunto de operaciones queryMSimilarVecswithPosNeg, que es fácil de entender. El primer paso es obtener un conjunto de palabras como resultado inverso de negWordList y luego comparar este resultado inverso con otro. conjunto de palabras para obtener el efecto "negativo-negativo-positivo" De esta manera, un conjunto de listas de pares de "correlación de palabras" topN representa la relación entre los dos grupos de palabras.