我想对职位描述做一些文本分析,并打算使用nltk。我可以建立一个字典并删除停用词,这是我想要的一部分。然而,除了单个单词及其频率之外,我还希望保留有意义的“单词组”并计算它们。
例如,在包含“机器学习”的职位描述中,我不想单独考虑“机器”和“学习”,但如果它经常一起出现,请保留字典组。最有效的方法是什么? (我想我不需要超越包含2个或单词的单词组)。并且:我应该在哪个时候删除禁用词?
以下是一个例子:
text = 'As a Data Scientist, you will focus on machine
learning and Natural Language Processing'
我想要的词典是:
dict = ['data scientist', 'machine learning', 'natural language processing',
'data', 'scientist', 'focus', 'machine', 'learning', 'natural'
'language', 'processing']
答案 0 :(得分:1)
您想要做的就是使用nltk中的collocations
。
答案 1 :(得分:1)
将多字表达式标记为元组,然后将它们放入一组以便于查找。最简单的方法是使用nltk.ngrams
,它允许您直接迭代文本中的ngrams。由于您的示例数据包含三元组,因此搜索n
最多3个。
raw_keywords = [ 'data scientist', 'machine learning', 'natural language processing',
'data', 'scientist', 'focus', 'machine', 'learning', 'natural'
'language', 'processing']
keywords = set(tuple(term.split()) for term in raw_keywords)
tokens = nltk.word_tokenize(text.lower())
# Scan text once for each ngram size.
for n in 1, 2, 3:
for ngram in nltk.ngrams(tokens, n):
if ngram in keywords:
print(ngram)
如果您有大量文本,您可以通过迭代最大ngrams(使用选项pad_right=True
来检查您是否获得加速,以避免丢失小的ngram大小)。两种方式的查找次数都是相同的,所以我怀疑它会有很大的不同,除了返回结果的顺序。
for ngram in nltk.ngrams(tokens, n, pad_right=True):
for k in range(n):
if ngram[:k+1] in keywords:
print(ngram[:k+1])
至于删除禁用词:如果你删除了它们,你就会生成没有之前的ngrams,例如"缝纫机和学习中心"将匹配"机器学习"删除禁用词后。你必须决定这是否是你想要的东西。如果是我,我会在关键字扫描之前删除标点符号,但保留停用词。
答案 2 :(得分:1)
谢谢@Batman,我在collocations
玩了一下,结果只需要几行代码。 (显然'有意义的文字'应该更长时间才能找到实际的搭配)
meaningful_text = 'As a Data Scientist, you will focus on machine
learning and Natural Language Processing'
from nltk.collocations import *
bigram_measures = nltk.collocations.BigramAssocMeasures()
finder = BigramCollocationFinder.from_words(word_tokenize(meaningful_text))
scored = finder.score_ngrams(bigram_measures.raw_freq)
sorted(scored, key=lambda s: s[1], reverse=True)