用'word groups'创建一个字典

时间:2017-03-12 19:55:28

标签: python nltk gensim

我想对职位描述做一些文本分析,并打算使用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']

3 个答案:

答案 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)