那么,我怎样才能将一个单词的出现与它在一个段落中的实例联系起来,从而产生上面所期望的结果呢?
将过程分成两部分:查找段落和查找单词
from nltk.tokenize import RegexpTokenizer
import re, collections
p = r'<P ID=\d+>(.*?)</P>'
paras = RegexpTokenizer(p)
words = RegexpTokenizer(r'\w+')
解析时保留两个词典:一个用于收集频率,一个用于文档频率。
col_freq = collections.Counter()
doc_freq = collections.Counter()
遍历段落;获取段落中的单词;将单词输入col_freq dict,并将一组单词输入doc_freq dict
for para in paras.tokenize(text):
tokens = [word.lower() for word in words.tokenize(para)]
col_freq.update(tokens)
doc_freq.update(set(tokens))
把这两本词典结合起来。
d = {word:(col_freq[word], doc_freq[word]) for word in col_freq}
有一些效率低下-分析文本两次-但它可以调整,如果它成为一个问题。
RegexpTokenizer
真的没有什么比
re.findall()
在这种情况下,但是
兽皮
一些细节,使这个不那么冗长,所以我用了它。
有时
re
不能很好地处理格式错误的标记。分析段落可以用BeautifulSoup完成。
from bs4 import BeautifulSoup
soup = BeautifulSoup(text,"html.parser")
for para in soup.find_all('p'):
tokens = [word.lower() for word in words.tokenize(para.text)]
print(tokens)
## col_freq.update(tokens)
## doc_freq.update(set(tokens))