【问题标题】:Generating dictionaries to categorize tweets into pre-defined categories using NLTK使用 NLTK 生成字典以将推文分类为预定义的类别
【发布时间】:2020-06-07 02:55:11
【问题描述】:

我有一个 twitter 用户列表 (screen_names),我需要根据他们的兴趣将他们分为 7 个预定义的类别 - 教育、艺术、体育、商业、政治、汽车、技术。 我在 Python 中提取了用户的最后 100 条推文,并在清理推文后为每个用户创建了一个语料库。

正如这里提到的Tweet classification into multiple categories on (Unsupervised data/tweets)
我正在尝试在每个类别下生成常用词的词典,以便我可以将其用于分类。

有没有一种方法可以自动为一组自定义单词生成这些词典?

然后我可以使用这些来使用 tf-idf 分类器对推特数据进行分类,并获得推文与每个类别的对应程度。最高值将为我们提供最可能的推文类别。

但是由于分类是基于这些预先生成的字典,我正在寻找一种方法来为自定义的类别列表自动生成它们。

示例字典:

Education - ['book','teacher','student'....]

Automobiles - ['car','auto','expo',....]

示例 I/O:

**Input :** 
UserA - "students visited share learning experience eye opening 
article important preserve linaugural workshop students teachers 
others know coding like know alphabets vision driving codeindia office 
initiative get students tagging wrong people apologies apologies real 
people work..."
.
.
UserN - <another corpus of cleaned tweets>


**Expected output** : 
UserA - Education (61%)
UserN - Automobiles (43%)

【问题讨论】:

  • 如果您可以提供您正在使用的输入和您期望的输出作为文本,则获得建议/解决方案的可能性更高。
  • @moys 我添加了一些例子来澄清。
  • 您是否问如何构建特定主题(例如教育)的词典?诸如与主题相关的词条之类的东西?或者你问如何从你的语料库中的推文中提取那些与主题相关的词?
  • 我在问如何构建这些主题相关词条的词典。
  • 您可以使用您知道与特定主题相关的文本中最常见的词形还原标记。您尝试对文本进行分类的方式听起来像 tf-idf 无论如何都是正确的分类方式,这样您就可以在搜索引擎中为每条推文与每个类别的词袋进行比较。或者使用词向量的余弦相似度。另一种方法是对数据子集进行注释,这意味着您对一些文本进行分类,然后将它们与语料库的其余部分进行比较以进行分类。

标签: python machine-learning nlp nltk text-classification


【解决方案1】:

TL;DR

标签对于监督机器学习是必要的。如果您没有包含 Xs(输入文本)和 Y(输出标签)的训练数据,那么 (i) 监督学习可能不是您想要的,或者 (ii) 您必须创建一个包含文本和对应的标签。

长期

让我们尝试对其进行分解,看看是否反映了您正在寻找的内容。

我有一个 twitter 用户列表 (screen_names),我需要将它们分为 7 个预定义类别 - 教育、艺术、体育、商业、政治、汽车、技术

因此,您的最终任务是将推文标记为 7 个类别。

我用 Python 提取了用户的最后 100 条推文,并在清理推文后为每个用户创建了一个语料库。

如果您想从头开始训练有监督的机器学习模型,100 个数据点绝对不足以做任何事情。

另一件事是corpus 的定义。语料库是文本的主体,因此将任何字符串列表称为语料库并没有错。但是,要进行任何有监督的训练,每个文本都应该带有相应的标签

但我看到有些人在没有任何标签的情况下进行无监督分类!

现在,这是一个矛盾的说法 =)

无监督分类

是的,有“无监督学习”,这通常意味着学习输入的表示,通常输入的表示用于(i)生成或(ii)样本。

从表示中生成意味着从表示中创建一个与无监督模型从中学习的数据相似的数据点。在文本处理/NLP 的情况下,这通常意味着从头开始生成新句子,例如https://transformer.huggingface.co/

对表示进行采样意味着给无监督模型一个文本,并且模型应该提供一些无监督模型从中学习的信号。例如。给定一个语言模型和一个新句子,我们想估计句子的概率,然后我们用这个概率来比较不同句子的概率。

Algorithmia 有一篇不错的摘要博文 https://algorithmia.com/blog/introduction-to-unsupervised-learning 和更现代的观点 https://sites.google.com/view/berkeley-cs294-158-sp20/home

信息量很大,但你不告诉我如何#$%^&-ing 进行无监督分类!

是的,矛盾的解释还没有结束。如果我们看一下文本分类,我们到底在做什么?

我们正在将输入文本拟合到一些预定义的类别中。在您的情况下,标签是预定义的,但是

问:信号究竟来自哪里?

A:当然,不要再从推文中分散我的注意力了!告诉我怎么分类!!!

问:你如何告诉模型一条推文应该是这个标签而不是另一个标签?

A:来自无监督学习,对吧?这不就是无监督学习应该做的吗?要将输入文本映射到输出标签?

没错,这就是矛盾,

监督学习将输入文本映射到输出标签不是无监督学习

那我该怎么办?我需要使用无监督学习,我想做分类。

那么问题是问:

我一直听说的所有这些 AI 怎么样,我可以用 3 行代码进行分类。

他们不使用听起来像芝麻街角色的无监督语言模型,例如ELMO、BERT、ERNIE?

我猜你的意思是https://github.com/ThilinaRajapakse/simpletransformers#text-classification

from simpletransformers.classification import ClassificationModel
import pandas as pd


# Train and Evaluation data needs to be in a Pandas Dataframe of two columns. The first column is the text with type str, and the second column is the label with type int.
train_data = [['Example sentence belonging to class 1', 1], ['Example sentence belonging to class 0', 0]]
train_df = pd.DataFrame(train_data)

eval_data = [['Example eval sentence belonging to class 1', 1], ['Example eval sentence belonging to class 0', 0]]
eval_df = pd.DataFrame(eval_data)

# Create a ClassificationModel
model = ClassificationModel('bert', 'bert-base') # You can set class weights by using the optional weight argument

# Train the model
model.train_model(train_df)

注意评论:

训练和评估数据需要位于两列的 Pandas 数据框中。第一列是str类型的text,第二列是int类型的label

是的,这是更现代的方法:

  • 首先使用预训练的语言模型将您的文本转换为输入表示
  • 然后将输入表示及其相应的标签输入到分类器

请注意,您仍然无法避免需要标签来训练监督分类器的事实

等一下,你的意思是我一直听到的所有这些 AI 都不是“无监督分类”。

热瑙。确实没有“无监督分类”之类的东西(还),不知何故,(i)标签需要手动定义,(ii)输入到标签之间的映射应该存在

定义范式的正确词是迁移学习,其中语言是

  • 以自我监督的方式学习(实际上并不是真正的无监督),因此模型学习将任何文本转换为某种数字表示

  • 然后使用带有标记数据的数字表示来生成分类器。

【讨论】:

  • 很好的答案!我想补充一点,通过无监督学习,您可以将输入(在本例中为文本)映射到具有内在差异的不同组,但它们根本不会被标记,也不会超出用户的任何意义给他们(算法可以告诉一些文本属于不同的组,但不是这些组的含义或根据内容为它们“推断”一些标签)
猜你喜欢
  • 2020-05-12
  • 1970-01-01
  • 2013-10-05
  • 2017-05-09
  • 2015-12-22
  • 2016-08-20
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
相关资源
最近更新 更多