从文本内容生成标签
machine-learning
nlp
nltk
python
4
0

我很好奇是否存在通过使用一些权重计算,出现率或其他工具从给定文本生成关键字/标签的算法/方法。

另外,如果您为此提出了任何基于Python的解决方案/库,我将不胜感激。

谢谢

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

一种方法是提取文档中出现频率比您偶然期望的单词高的单词。例如,在大量文档中说“马尔科夫”一词几乎从未见过。但是,在同一收藏集中的特定文档中,Markov经常出现。这表明Markov可能是与文档关联的很好的关键字或标记。

为了识别这样的关键字,您可以使用关键字和文档的逐点相互信息 。这由PMI(term, doc) = log [ P(term, doc) / (P(term)*P(doc)) ] 。这将大致告诉您,在大型文档中遇到该术语时,您对特定文档中的术语感到惊讶的程度是多少(或更多)。

要确定与文档相关联的5个最佳关键字,您只需按其与文档的PMI得分对术语进行排序,然后选择得分最高的5个。

如果要提取多字标签 ,请参阅StackOverflow问题“ 如何从一系列文本条目中提取常用/重要短语”

从我对这个问题的回答中借来的NLTK搭配方法介绍了如何使用n-gram PMI在大约7行代码中提取有趣的多字表达式,例如:

import nltk
from nltk.collocations import *
bigram_measures = nltk.collocations.BigramAssocMeasures()

# change this to read in your data
finder = BigramCollocationFinder.from_words(
   nltk.corpus.genesis.words('english-web.txt'))

# only bigrams that appear 3+ times
finder.apply_freq_filter(3) 

# return the 5 n-grams with the highest PMI
finder.nbest(bigram_measures.pmi, 5)  
收藏
评论

http://en.wikipedia.org/wiki/Latent_Dirichlet_allocation尝试将培训语料库中的每个文档表示为主题的混合物,而主题又是将单词映射到概率的分布。

我曾经用它来将一系列产品评论分解为在所有文档(例如“客户服务”,“产品可用性”等)中都谈到的潜在想法。基本模型并不主张转换的方法主题将模型建模成一个单词,描述主题的含义。.但是,一旦训练好模型,人们就会想到各种启发式方法。

我建议您尝试使用http://mallet.cs.umass.edu/并查看此模型是否符合您的需求。

LDA是一种完全不受监督的算法,这意味着它不需要您手动注释任何很棒的内容,但另一方面,它可能不会为您提供您希望它提供的主题。

收藏
评论

首先,用于计算语言学的主要python库是NLTK (“ 自然语言工具包 ”)。这是一个稳定,成熟的库,由专业计算语言学家创建和维护。它也有一个广泛收集的教程,常见问题解答等。我强烈推荐它的。

下面是一个简单的python代码模板,用于解决您的Question中提出的问题;尽管它是运行的模板-将任何文本作为字符串提供(如我所做的那样),它将返回单词频率列表以及这些单词的排名列表(按``重要性''(或适合用作关键字) ),方法很简单。

给定文档的关键字(显然)是从文档中的重要单词中选择的,即可能将其与另一个文档区分开的单词。如果您对文本的主题没有先验知识,那么一种常见的技术是从其频率来推断给定单词/术语的重要性或重要性,或者重要性= 1 /频率。

text = """ The intensity of the feeling makes up for the disproportion of the objects.  Things are equal to the imagination, which have the power of affecting the mind with an equal degree of terror, admiration, delight, or love.  When Lear calls upon the heavens to avenge his cause, "for they are old like him," there is nothing extravagant or impious in this sublime identification of his age with theirs; for there is no other image which could do justice to the agonising sense of his wrongs and his despair! """

BAD_CHARS = ".!?,\'\""

# transform text into a list words--removing punctuation and filtering small words
words = [ word.strip(BAD_CHARS) for word in text.strip().split() if len(word) > 4 ]

word_freq = {}

# generate a 'word histogram' for the text--ie, a list of the frequencies of each word
for word in words :
  word_freq[word] = word_freq.get(word, 0) + 1

# sort the word list by frequency 
# (just a DSU sort, there's a python built-in for this, but i can't remember it)
tx = [ (v, k) for (k, v) in word_freq.items()]
tx.sort(reverse=True)
word_freq_sorted = [ (k, v) for (v, k) in tx ]

# eg, what are the most common words in that text?
print(word_freq_sorted)
# returns: [('which', 4), ('other', 4), ('like', 4), ('what', 3), ('upon', 3)]
# obviously using a text larger than 50 or so words will give you more meaningful results

term_importance = lambda word : 1.0/word_freq[word]

# select document keywords from the words at/near the top of this list:
map(term_importance, word_freq.keys())
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号