【说话处理惩罚与Python】11.3数据采集
添加时间:2013-6-6 点击量:
从网上获取数据
我们评论辩论过接见单个文件,如RSS订阅、搜刮引擎的成果。
1、有的时辰,还须要多量的WEB文本。最简单的办法是获得出版的网页文本的文集。在http://www.sigwac.org.uk/保护的有一个资料列表。
2、应用收集爬虫。
从字处理惩罚器文件获取数据
例11-1. 将MicrosoftWord创建的HTML转换成CSV
def lexical_data(html_file):
SEP=_ENTRY
html = open(html_file).read()
html = re.sub(r<p, SEP+ <p, html)
text = nltk.clean_html(html)
text = .join(text.split())
for entry in text.split(SEP):
if entry.count( ) > 2:
yield entry.split( , 3)
>>>import csv
>>>writer= csv.writer(open("dict1.csv","wb"))
>>>writer.writerows(lexical_data("dict.htm"))
从电子表格和数据库中获得数据
电子表格凡是用于获取词表或范式。
我们如今假设在一个CSV文件中有这些内容:
"sleep","sli:p","v.i","a condition of bodyand mind..."
"walk","wo:k","v.intr","progress bylifting and setting downeach foot ..."
"wake","weik","intrans","cease to sleep"
那么,我们可以查询:
>>>import csv
>>>lexicon = csv.reader(open(dict.csv))
>>>pairs = [(lexeme, defn) for (lexeme, _, _,defn) in lexicon]
>>>lexemes, defns= zip(pairs)
>>>defn_words= set(w for defn in defnsfor win defn.split())
>>>sorted(defn_words.difference(lexemes))
[..., a, and, body, by, cease, condition, down, each,
foot, lifting, mind, of, progress, setting, to]
这些信息将可以领导正在进行的工作来雄厚词汇和更新关系数据库的内容。
转换数据格局
已标注说话数据很少以最便利的格局保存,往往须要进行各类格局转换。
一种是输入和输出格局都是同构的。比如将词汇数据从Toolbox转换成XML。
一种是输出是输入的择要。例如下面的例子:
>>>idx =nltk.Index((defn_word,lexeme)
... for (lexeme, defn) in pairs
... for defn_wordin nltk.word_tokenize(defn)
... if len(defn_word) > 3) ④
>>>idx_file = open("dict.idx", "w")
>>>for wordin sorted(idx):
... idx_words =, .join(idx[word])
... idx_line = "%s: %s\n"%(word, idx_words) ⑤
... idx_file.write(idx_line)
>>>idx_file.close()
#此时,dict.idx包含下面的内容
body: sleep
cease:wake
condition: sleep
down:walk
each: walk
foot: walk
lifting: walk
mind:sleep
progress:walk
setting: walk
sleep: wake
决意要包含的标注层
这里供给了一些常用的标注层:
分词:文本的书写情势不克不及明白地辨认它的标识符。分词和规范化的版本作为常规的正
式版本的补充可能是一个很是便利的资料。
断句:正如我们在第3章中看到的,断句比它看上去的似乎加倍艰苦。是以,一些语料
库应用明白的标注来断句。
分段:段和其他布局元素(题目,章节等)可能会明白注明。
词性:文档中的每个单词的词类。
句法布局:一个树状布局,显示一个句子的构成布局。
浅层语义:定名实体和共指标注,语义角色标签。
对话与段落:对话行动标识表记标帜,修辞布局。
然则,如今的语料库之间在如何默示标注上并没有几许一致性。
然而,有两个大类的标注应当加以差别。
内联标注:为文档标注词性时,字符串“fly”可能被调换为字符串“fly/NN”来默示词fly在文中是名词。
对立标注:对立标注不批改原始文档,而是创建一个新的文档,经由过程应用指针引用原始文档来增长标注信息。例如:这个新的文档可能包含字符串“<tokenid=8 pos=NN/>”,默示8号标识符是一个名词。
标注和对象
NLP的挑衅是编写法度处理惩罚这种格局的泛化。例如:若是编程任务涉及树数据,文件格局容许随便率性有向图,那么必须验证输入数据搜检树的属性如:根、连通性、无环。若是输入文件包含其他层的标注,该法度将须要知道数据加载时如何忽视它们,将树数据保存到文件时不克不及否定或扼杀这些层。
创建和公布一个新的语料库时,尽可能应用现有广泛应用的格局是权宜之计。若是如许不成能,语料库可以带有一些软件——如nltk.corpus模块——支撑现有的接口办法。
处理惩罚濒危说话时希罕重视事项
世界上大多半说话面对灭尽。对此,很多说话学家都在尽力工作,记录说话,构建这个世界说话遗产的首要方面的雄厚记录。在NLP的范畴能为这方面的尽力供给什么帮助吗?开辟标注器、解析器、定名实体辨认等不是优先的,凡是没有足够的数据来开辟如许的对象。相反,最经常提出的是须要更好的对象来收集和保护数据,希罕是文本和词汇。
容许经由过程类似的发音查找词项也是很有益的。
下面是如何做到这一点的一个简单演示:
1、我们要断定易混合的字母序列,映射错杂版本到更简单的版本。
2、辅音群中字母的相对次序是拼写错误的一个起原,所以我们将辅音字母次序规范化。
>>>mappings= [(ph, f), (ght, t), (^kn, n), (qu, kw),
... ([aeiou]+, a), (r(.)\1, r\1)]
>>>def signature(word):
... for patt,repl in mappings:
... word= re.sub(patt, repl, word)
... pieces= re.findall([^aeiou]+, word)
... return .join(char for piece in pieces for char in sorted(piece))[:8]
>>>signature(illefent)
lfnt
>>>signature(ebsekwieous)
bskws
>>>signature(nuculerr)
nclr
下一步,我们对词典中的所有词汇创建从特点到词汇的映射。
>>>signatures = nltk.Index((signature(w),w)for win nltk.corpus.words.words())
>>>signatures[signature(nuculerr)]
[anicular, inocular, nucellar, nuclear, unicolor, uniocular, unocular]
最后,我们应当遵守与原词的类似程度对成果进行排序:
>>>def rank(word, wordlist):
... ranked =sorted((nltk.edit_dist(word, w),w)for win wordlist)
... return [word for (_, word)in ranked]
>>>def fuzzy_spell(word):
... sig = signature(word)
... if sig in signatures:
... return rank(word, signatures[sig])
... else:
... return []
>>>fuzzy_spell(illefent)
[olefiant, elephant, oliphant, elephanta]
>>>fuzzy_spell(ebsekwieous)
[obsequious]
>>>fuzzy_spell(nucular)
[nuclear, nucellar, anicular, inocular, unocular, unicolor, uniocular]
无论对感情还是对生活,“只要甜不要苦”都是任性而孩子气的,因为我们也不完美,我们也会伤害人。正因为我们都不完美,也因为生活从不是事事如意,所以对这些“瑕疵”的收纳才让我们对生活、对他人的爱变得日益真实而具体。—— 汪冰《世界再亏欠你,也要敢于拥抱幸福》
从网上获取数据
我们评论辩论过接见单个文件,如RSS订阅、搜刮引擎的成果。
1、有的时辰,还须要多量的WEB文本。最简单的办法是获得出版的网页文本的文集。在http://www.sigwac.org.uk/保护的有一个资料列表。
2、应用收集爬虫。
从字处理惩罚器文件获取数据
例11-1. 将MicrosoftWord创建的HTML转换成CSV
def lexical_data(html_file):
SEP=_ENTRY
html = open(html_file).read()
html = re.sub(r<p, SEP+ <p, html)
text = nltk.clean_html(html)
text = .join(text.split())
for entry in text.split(SEP):
if entry.count( ) > 2:
yield entry.split( , 3)
>>>import csv
>>>writer= csv.writer(open("dict1.csv","wb"))
>>>writer.writerows(lexical_data("dict.htm"))
从电子表格和数据库中获得数据
电子表格凡是用于获取词表或范式。
我们如今假设在一个CSV文件中有这些内容:
"sleep","sli:p","v.i","a condition of bodyand mind..."
"walk","wo:k","v.intr","progress bylifting and setting downeach foot ..."
"wake","weik","intrans","cease to sleep"
那么,我们可以查询:
>>>import csv
>>>lexicon = csv.reader(open(dict.csv))
>>>pairs = [(lexeme, defn) for (lexeme, _, _,defn) in lexicon]
>>>lexemes, defns= zip(pairs)
>>>defn_words= set(w for defn in defnsfor win defn.split())
>>>sorted(defn_words.difference(lexemes))
[..., a, and, body, by, cease, condition, down, each,
foot, lifting, mind, of, progress, setting, to]
这些信息将可以领导正在进行的工作来雄厚词汇和更新关系数据库的内容。
转换数据格局
已标注说话数据很少以最便利的格局保存,往往须要进行各类格局转换。
一种是输入和输出格局都是同构的。比如将词汇数据从Toolbox转换成XML。
一种是输出是输入的择要。例如下面的例子:
>>>idx =nltk.Index((defn_word,lexeme)
... for (lexeme, defn) in pairs
... for defn_wordin nltk.word_tokenize(defn)
... if len(defn_word) > 3) ④
>>>idx_file = open("dict.idx", "w")
>>>for wordin sorted(idx):
... idx_words =, .join(idx[word])
... idx_line = "%s: %s\n"%(word, idx_words) ⑤
... idx_file.write(idx_line)
>>>idx_file.close()
#此时,dict.idx包含下面的内容
body: sleep
cease:wake
condition: sleep
down:walk
each: walk
foot: walk
lifting: walk
mind:sleep
progress:walk
setting: walk
sleep: wake
决意要包含的标注层
这里供给了一些常用的标注层:
分词:文本的书写情势不克不及明白地辨认它的标识符。分词和规范化的版本作为常规的正
式版本的补充可能是一个很是便利的资料。
断句:正如我们在第3章中看到的,断句比它看上去的似乎加倍艰苦。是以,一些语料
库应用明白的标注来断句。
分段:段和其他布局元素(题目,章节等)可能会明白注明。
词性:文档中的每个单词的词类。
句法布局:一个树状布局,显示一个句子的构成布局。
浅层语义:定名实体和共指标注,语义角色标签。
对话与段落:对话行动标识表记标帜,修辞布局。
然则,如今的语料库之间在如何默示标注上并没有几许一致性。
然而,有两个大类的标注应当加以差别。
内联标注:为文档标注词性时,字符串“fly”可能被调换为字符串“fly/NN”来默示词fly在文中是名词。
对立标注:对立标注不批改原始文档,而是创建一个新的文档,经由过程应用指针引用原始文档来增长标注信息。例如:这个新的文档可能包含字符串“<tokenid=8 pos=NN/>”,默示8号标识符是一个名词。
标注和对象
NLP的挑衅是编写法度处理惩罚这种格局的泛化。例如:若是编程任务涉及树数据,文件格局容许随便率性有向图,那么必须验证输入数据搜检树的属性如:根、连通性、无环。若是输入文件包含其他层的标注,该法度将须要知道数据加载时如何忽视它们,将树数据保存到文件时不克不及否定或扼杀这些层。
创建和公布一个新的语料库时,尽可能应用现有广泛应用的格局是权宜之计。若是如许不成能,语料库可以带有一些软件——如nltk.corpus模块——支撑现有的接口办法。
处理惩罚濒危说话时希罕重视事项
世界上大多半说话面对灭尽。对此,很多说话学家都在尽力工作,记录说话,构建这个世界说话遗产的首要方面的雄厚记录。在NLP的范畴能为这方面的尽力供给什么帮助吗?开辟标注器、解析器、定名实体辨认等不是优先的,凡是没有足够的数据来开辟如许的对象。相反,最经常提出的是须要更好的对象来收集和保护数据,希罕是文本和词汇。
容许经由过程类似的发音查找词项也是很有益的。
下面是如何做到这一点的一个简单演示:
1、我们要断定易混合的字母序列,映射错杂版本到更简单的版本。
2、辅音群中字母的相对次序是拼写错误的一个起原,所以我们将辅音字母次序规范化。
>>>mappings= [(ph, f), (ght, t), (^kn, n), (qu, kw),
... ([aeiou]+, a), (r(.)\1, r\1)]
>>>def signature(word):
... for patt,repl in mappings:
... word= re.sub(patt, repl, word)
... pieces= re.findall([^aeiou]+, word)
... return .join(char for piece in pieces for char in sorted(piece))[:8]
>>>signature(illefent)
lfnt
>>>signature(ebsekwieous)
bskws
>>>signature(nuculerr)
nclr
下一步,我们对词典中的所有词汇创建从特点到词汇的映射。
>>>signatures = nltk.Index((signature(w),w)for win nltk.corpus.words.words())
>>>signatures[signature(nuculerr)]
[anicular, inocular, nucellar, nuclear, unicolor, uniocular, unocular]
最后,我们应当遵守与原词的类似程度对成果进行排序:
>>>def rank(word, wordlist):
... ranked =sorted((nltk.edit_dist(word, w),w)for win wordlist)
... return [word for (_, word)in ranked]
>>>def fuzzy_spell(word):
... sig = signature(word)
... if sig in signatures:
... return rank(word, signatures[sig])
... else:
... return []
>>>fuzzy_spell(illefent)
[olefiant, elephant, oliphant, elephanta]
>>>fuzzy_spell(ebsekwieous)
[obsequious]
>>>fuzzy_spell(nucular)
[nuclear, nucellar, anicular, inocular, unocular, unicolor, uniocular]