自然语言处理

时间:2022-12-08 01:31:00

一直做这些关于声音和文字的东西,今天看到一些总结的《自然语言处理》,特此贴在此处,以备后续查询。里面的超链接可以点击查阅或者有的可以下载自然语言处理


http://www.52nlp.cn/2017/04 

之前写过《中英文*语料上的Word2Vec实验》,近期有不少同学在这篇文章下留言提问,加上最近一些工作也与Word2Vec相关,于是又做了一些功课,包括重新过了一遍Word2Vec的相关资料,试了一下gensim的相关更新接口,google了一下"wikipedia word2vec" or "* word2vec" 相关的英中文资料,发现多数还是走得这篇文章的老路,既通过gensim提供的*预处理脚本"gensim.corpora.WikiCorpus"提取维基语料,每篇文章一行文本存放,然后基于gensim的Word2Vec模块训练词向量模型。这里再提供另一个方法来处理*的语料,训练词向量模型,计算词语相似度(Word Similarity)。关于Word2Vec, 如果英文不错,推荐从这篇文章入手读相关的资料: Getting started with Word2Vec 。

这次我们仅以英文*语料为例,首先依然是下载*的最新XML打包压缩数据,在这个英文最新更新的数据列表下:https://dumps.wikimedia.org/enwiki/latest/ ,找到 "enwiki-latest-pages-articles.xml.bz2" 下载,这份英文*全量压缩数据的打包时间大概是2017年4月4号,大约13G,我通过家里的电脑wget下载大概花了3个小时,电信100M宽带,速度还不错。

接下来就是处理这份压缩的XML英文*语料了,这次我们使用WikiExtractor:

WikiExtractor.py is a Python script that extracts and cleans text from a Wikipedia database dump.
The tool is written in Python and requires Python 2.7 or Python 3.3+ but no additional library.

WikiExtractor是一个Python 脚本,专门用于提取和清洗Wikipedia的dump数据,支持Python 2.7 或者 Python 3.3+,无额外依赖,安装和使用都非常方便:

安装:
git clone https://github.com/attardi/wikiextractor.git
cd wikiextractor/
sudo python setup.py install

使用:
WikiExtractor.py -o enwiki enwiki-latest-pages-articles.xml.bz2

......
INFO: 53665431 Pampapaul
INFO: 53665433 Charles Frederick Zimpel
INFO: Finished 11-process extraction of 5375019 articles in 8363.5s (642.7 art/s)

这个过程总计花了2个多小时,提取了大概537万多篇文章。关于我的机器配置,可参考:《深度学习主机攒机小记

提取后的文件按一定顺序切分存储在多个子目录下:

自然语言处理

每个子目录下的又存放若干个以wiki_num命名的文件,每个大小在1M左右,这个大小可以通过参数 -b 控制:

-b n[KMG], --bytes n[KMG] maximum bytes per output file (default 1M)

自然语言处理

我们看一下wiki_00里的具体内容:


Anarchism

Anarchism is a political philosophy that advocates self-governed societies based on voluntary institutions. These are often described as stateless societies, although several authors have defined them more specifically as institutions based on non-hierarchical free associations. Anarchism holds the state to be undesirable, unnecessary, and harmful.
...
Criticisms of anarchism include moral criticisms and pragmatic criticisms. Anarchism is often evaluated as unfeasible or utopian by its critics.



Autism

Autism is a neurodevelopmental disorder characterized by impaired social interaction, verbal
and non-verbal communication, and restricted and repetitive behavior. Parents usually notice signs in the first two years of their child's life. These signs often develop gradually, though some children with autism reach their developmental milestones at a
normal pace and then regress. The diagnostic criteria require that symptoms become apparent in early childhood, typically before age three.
...

...

每个wiki_num文件里又存放若干个doc,每个doc都有相关的tag标记,包括id, url, title等,很好区分。

这里我们按照Gensim作者提供的word2vec tutorial里"memory-friendly iterator"方式来处理英文*的数据。代码如下,也同步放到了github里:train_word2vec_with_gensim.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: Pan Yang (panyangnlp@gmail.com)
# Copyright 2017 @ Yu Zhen
 
import gensim
import logging
import multiprocessing
import os
import re
import sys
 
from pattern.en import tokenize
from time import time
 
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s',
level=logging.INFO)
 
 
def cleanhtml(raw_html):
cleanr = re.compile('<.*?>')
cleantext = re.sub(cleanr, ' ', raw_html)
return cleantext
 
 
class MySentences(object):
def __init__(self, dirname):
self.dirname = dirname
 
def __iter__(self):
for root, dirs, files in os.walk(self.dirname):
for filename in files:
file_path = root + '/' + filename
for line in open(file_path):
sline = line.strip()
if sline == "":
continue
rline = cleanhtml(sline)
tokenized_line = ' '.join(tokenize(rline))
is_alpha_word_line = [word for word in
tokenized_line.lower().split()
if word.isalpha()]
yield is_alpha_word_line
 
 
if __name__ == '__main__':
if len(sys.argv) != 2:
print "Please use python train_with_gensim.py data_path"
exit()
data_path = sys.argv[1]
begin = time()
 
sentences = MySentences(data_path)
model = gensim.models.Word2Vec(sentences,
size=200,
window=10,
min_count=10,
workers=multiprocessing.cpu_count())
model.save("data/model/word2vec_gensim")
model.wv.save_word2vec_format("data/model/word2vec_org",
"data/model/vocabulary",
binary=False)
 
end = time()
print "Total procesing time: %d seconds" % (end - begin)

注意其中的word tokenize使用了pattern里的英文tokenize模块,当然,也可以使用nltk里的word_tokenize模块,做一点修改即可,不过nltk对于句尾的一些词的work tokenize处理的不太好。另外我们设定词向量维度为200, 窗口长度为10, 最小出现次数为10,通过 is_alpha() 函数过滤掉标点和非英文词。现在可以用这个脚本来训练英文*的Word2Vec模型了:
python train_word2vec_with_gensim.py enwiki

2017-04-22 14:31:04,703 : INFO : collecting all words and their counts
2017-04-22 14:31:04,704 : INFO : PROGRESS: at sentence #0, processed 0 words, keeping 0 word types
2017-04-22 14:31:06,442 : INFO : PROGRESS: at sentence #10000, processed 480546 words, keeping 33925 word types
2017-04-22 14:31:08,104 : INFO : PROGRESS: at sentence #20000, processed 983240 words, keeping 51765 word types
2017-04-22 14:31:09,685 : INFO : PROGRESS: at sentence #30000, processed 1455218 words, keeping 64982 word types
2017-04-22 14:31:11,349 : INFO : PROGRESS: at sentence #40000, processed 1957479 words, keeping 76112 word types
......
2017-04-23 02:50:59,844 : INFO : worker thread finished; awaiting finish of 2 more threads 2017-04-23 02:50:59,844 : INFO : worker thread finished; awaiting finish of 1 more threads 2017-04-23 02:50:59,854 : INFO : worker thread finished; awaiting finish of 0 more threads 2017-04-23 02:50:59,854 : INFO : training on 8903084745 raw words (6742578791 effective words) took 37805.2s, 178351 effective words/s
2017-04-23 02:50:59,855 : INFO : saving Word2Vec object under data/model/word2vec_gensim, separately None
2017-04-23 02:50:59,855 : INFO : not storing attribute syn0norm
2017-04-23 02:50:59,855 : INFO : storing np array 'syn0' to data/model/word2vec_gensim.wv.syn0.npy
2017-04-23 02:51:00,241 : INFO : storing np array 'syn1neg' to data/model/word2vec_gensim.syn1neg.npy
2017-04-23 02:51:00,574 : INFO : not storing attribute cum_table
2017-04-23 02:51:13,886 : INFO : saved data/model/word2vec_gensim
2017-04-23 02:51:13,886 : INFO : storing vocabulary in data/model/vocabulary
2017-04-23 02:51:17,480 : INFO : storing 868777x200 projection weights into data/model/word2vec_org
Total procesing time: 44476 seconds

这个训练过程中大概花了12多小时,训练后的文件存放在data/model下:

自然语言处理

我们来测试一下这个英文*的Word2Vec模型:

textminer@textminer:/opt/wiki/data$ ipython
Python 2.7.12 (default, Nov 19 2016, 06:48:10)
Type "copyright", "credits" or "license" for more information.
 
IPython 2.4.1 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python'
s own help system.
object? -> Details about 'object', use 'object??' for extra details.
 
In [1]: from gensim.models import Word2Vec
 
In [2]: en_wiki_word2vec_model = Word2Vec.load('data/model/word2vec_gensim')

首先来测试几个单词的相似单词(Word Similariy):

word:

In [3]: en_wiki_word2vec_model.most_similar('word')
Out[3]:
[('phrase', 0.8129693269729614),
('meaning', 0.7311851978302002),
('words', 0.7010501623153687),
('adjective', 0.6805518865585327),
('noun', 0.6461974382400513),
('suffix', 0.6440576314926147),
('verb', 0.6319557428359985),
('loanword', 0.6262609958648682),
('proverb', 0.6240501403808594),
('pronunciation', 0.6105246543884277)]

自然语言处理

similarity:

In [4]: en_wiki_word2vec_model.most_similar('similarity')
Out[4]:
[('similarities', 0.8517599701881409),
('resemblance', 0.786037266254425),
('resemblances', 0.7496883869171143),
('affinities', 0.6571112275123596),
('differences', 0.6465682983398438),
('dissimilarities', 0.6212711930274963),
('correlation', 0.6071442365646362),
('dissimilarity', 0.6062943935394287),
('variation', 0.5970577001571655),
('difference', 0.5928016901016235)]

自然语言处理

nlp:

In [5]: en_wiki_word2vec_model.most_similar('nlp')
Out[5]:
[('neurolinguistic', 0.6698148250579834),
('psycholinguistic', 0.6388964056968689),
('connectionism', 0.6027182936668396),
('semantics', 0.5866401195526123),
('connectionist', 0.5865628719329834),
('bandler', 0.5837364196777344),
('phonics', 0.5733655691146851),
('psycholinguistics', 0.5613113641738892),
('bootstrapping', 0.559638261795044),
('psychometrics', 0.5555593967437744)]

自然语言处理

learn:

In [6]: en_wiki_word2vec_model.most_similar('learn')
Out[6]:
[('teach', 0.7533557415008545),
('understand', 0.71148681640625),
('discover', 0.6749690771102905),
('learned', 0.6599283218383789),
('realize', 0.6390970349311829),
('find', 0.6308424472808838),
('know', 0.6171890497207642),
('tell', 0.6146825551986694),
('inform', 0.6008728742599487),
('instruct', 0.5998791456222534)]

自然语言处理

man:

In [7]: en_wiki_word2vec_model.most_similar('man')
Out[7]:
[('woman', 0.7243080735206604),
('boy', 0.7029494047164917),
('girl', 0.6441491842269897),
('stranger', 0.63275545835495),
('drunkard', 0.6136815547943115),
('gentleman', 0.6122575998306274),
('lover', 0.6108279228210449),
('thief', 0.609005331993103),
('beggar', 0.6083744764328003),
('person', 0.597919225692749)]

自然语言处理

再来看看其他几个相关接口:

In [8]: en_wiki_word2vec_model.most_similar(positive=['woman', 'king'], negative=['man'], topn=1)
Out[8]: [('queen', 0.7752252817153931)]
 
In [9]: en_wiki_word2vec_model.similarity('woman', 'man')
Out[9]: 0.72430799548282099
 
In [10]: en_wiki_word2vec_model.doesnt_match("breakfast cereal dinner lunch".split())
Out[10]: 'cereal'

我把这篇文章的相关代码还有另一篇“中英文*语料上的Word2Vec实验”的相关代码整理了一下,在github上建立了一个 Wikipedia_Word2vec 的项目,感兴趣的同学可以参考。

注:原创文章,转载请注明出处及保留链接“我爱自然语言处理”:http://www.52nlp.cn

本文链接地址:*语料中的词语相似度探索 http://www.52nlp.cn/?p=9454

本条目发布于 2017年04月24号。属于 深度学习自然语言处理语义相似度分类,被贴了  gensimgensim word2vecnltkPatternpyhton word2vecpythonpython gensimWikiExtractorWikipediaWikipedia_Word2vecWord Similarityword tokenizeword2vecWord2Vec Tutorial*维基语料 词语相似度语料 标签。 作者是52nlp

Airbnb(爱彼迎)的几次体验

4条回复 自然语言处理

Airbnb 最近有了中文名字:爱彼迎,貌似有些争议,不过之前我有三次良好的Airbnb住宿体验,刚好在这里记录一下,供大家参考。关于Airbnb的历史,大家可以参考*上的注解:

Airbnb(*地区品牌名为爱彼迎,取“让爱彼此相迎”之义),是一个让大众出租住宿民宿的网站,提供短期出租房屋或房间的服务。让旅行者可以通过网站或手机、发掘和预订世界各地的各种独特房源,为近年来共享经济发展的代表之一。该网站成立于2008年8月,公司总部位于美国加利福尼亚州旧金山,为一家私有公司,由“Airbnb, Inc.”负责管理营运。目前,Airbnb在192个国家、33,000个城市*有超过500,000笔出租数据。

第一次注册 Airbnb(爱彼迎)是在2015年8月,忘记了通过什么途径知道它的,但是记得第一次通过邀请链接注册可以获得200多元的旅行基金,所以就注册了。这里你也可以通过我的邀请链接注册,注册后你也可以获得200+的旅行基金,点击右边这链接即可:Airbnb旅行基金

第一次使用Airbnb的行程是2016年7月,去上海的参加本科同学聚会,带着不到2岁的宝宝,预定的是上海陆家嘴的一个江景公寓:

豪华装修,超大景观阳台,厨房配备全套餐具及微波炉,冰箱,洗衣机,熨斗,晾衣架,干净床上用品及毛巾,浴巾,一次性洗漱用品,每天客房清洁,每天更换床上用品,陆家嘴核心区域,地铁4号线浦东大道站1号出口,免费班车至国金中心,东方明珠,上海海洋水族馆,非常便捷.

预定付款后房东很快发来消息,意思是到公寓门口接待处直接报名字核实身份证那房卡即可。去了之后发现是酒店式公寓,不过感觉不错,面朝黄浦江,私密性也很好,入住手续很简单。

第二次使用Airbnb爱彼迎是在2016年9月,全家5口人去杭州,选择了西湖边的一个公寓:

本房源位于全杭州最靠近西湖的高端公寓,本公寓与西湖的距离只隔了一条马路的宽度,也是西湖景观最好热闹的片区和乘船的主要渡口。公寓位于西湖商圈中心,房源面积168平方,南北通透户型。三个卧室均配备1米8真皮软靠大床,上了楼顶后可观西湖全景。

到了杭州后对接的是一个负责房间保洁的阿姨,额外押了200块钱,房间基本如实所述,距离西湖很近,楼顶能看到大部门西湖景色,几个房间也很大,特别是带着老人和小朋友,有住家的感觉,比较方便。

第三次使用爱彼迎是在今年3月份,全家厦门鼓浪屿之行,选择了鼓浪屿码头边的一个民宿:

面朝大海手捧下午茶、家人围坐用餐的写意您将拥有;2个房间1.8大床和1.5大床;自助厨房一展厨艺;舒适客厅转角沙发看看大海看看电视随您意,向往的海景房就等您和家人共享;海湾公园饭后散步悠闲自在;咖啡一条街品尝世界各地的风味美食;酒吧一条街去放松去high吧!

接待我们的是房东,很客气,给我们钥匙之后就走了,住了2晚,去鼓浪屿和厦门大学很方便,第三天退房时房东还没赶过来,让我们把钥匙留在屋里就OK了。

总之,关于Airbnb,这三次体验都很不错,特别是全家出游带着老人和小朋友的时候,住在一起很有家的感觉。

注:原创文章,转载请注明出处及保留链接“我爱自然语言处理”:http://www.52nlp.cn

本文链接地址:Airbnb(爱彼迎)的几次体验 http://www.52nlp.cn/?p=9475