当前位置: 首页 > 工具软件 > NLP-progress > 使用案例 >

自然语言处理 - 两篇文章的阅读

侯兴为
2023-12-01

2020/08/07 -
这部分内容是我之前在简书的草稿,没有完整整理,后续将进行完整整理。

2020/06/17 -

这两天在学习word2vec模型原理的时候,看到了两篇文章,一篇是关于使用word2vec进行情感分类,另一篇是通过tf-idf这种方式运用LDA或者直接kmeans进行主题分类。
从这两篇文章中,相对与自然语言处理的模型来说, 我感觉,我学到的是更多的分析的过程和可视化的内容,这里扯远了,本片文章就是要写这个自然语言处理的过程

我就感觉,看完这两个文章,我好像学到了非常多的东西,但是我不知道写什么。
你比如说一些简单的东西,好像也不用写出来,高级的东西好像又没有。
(可能这也是我之前看各种论文的想法)
既然现在找不到比较好的办法来总结,那么我就来吧所有的内容都总结下来。
下面的内容主要针对文章[2]进行分析,因为文章[2]的内容算是覆盖了文章[1]。下面来开始分析。

  1. 环境部署
    tqdm 可以使用的这个进度条的库
    nltk 自然语言处理库
    bokeh 交互式可视化
    gensim 好像也是自然语言处理的库
    pyldavis lda的可视化库
    然后这个环境呢,他是使用anaconda来进行管理,这样我想起了之前的时候,我弄得个jupyter-lab我也没用过了。

  2. 数据获取
    这里数据获取他使用了某个数据源,然后再注册后使用key来获取。这部分数据获取没有什么问题。

  3. 数据处理
    简单可视化
    data.category.value_counts(normalize=True).plot(kind='bar', grid=True, figsize=(16, 9))
    数据筛选
    data = data[~data['description'].isnull()]
    data = data[(data.description.map(len) > 140) & (data.description.map(len) <= 300)]
    map,filter的使用非常便利。
    data.description.map(len).hist(figsize=(15, 5), bins=100)

    tokens = [word_tokenize(sent) for sent in sent_tokenize(text)]
    tokens = list(reduce(lambda x,y: x+y, tokens))
    tokens = list(filter(lambda token: token not in (stop_words + list(punctuation)) , tokens))

ta['description'] = data['description'].map(lambda d: unicode(d.decode('utf-8')))
data['tokens'] = data['description'].progress_map(lambda d: tokenizer(d))
def keywords(category):
    tokens = data[data['category'] == category]['tokens']
    alltokens = []
    for token_list in tokens:
        alltokens += token_list
    counter = Counter(alltokens)
    return counter.most_common(10)

for category in set(data['category']):
    print('category :', category)
    print('top 10 keywords:', keywords(category))
    print('---')

我觉得,很久以来我在写这个代码的时候,总是非常吃力,遇见一个功能,可能都得去现场查api,这就非常尴尬了。一开始说是觉得,这样能学的更快,但长此以往,这种方式浪费的时间非常多。
你可以看啊可能上面这些代码,不算难,但是很多我有时候也会去查,费劲。

groups = tsne_tfidf_df.groupby('category')
fig, ax = plt.subplots(figsize=(15, 10))
ax.margins(0.05) # Optional, just adds 5% padding to the autoscaling
for name, group in groups:
    ax.plot(group.x, group.y, marker='o', linestyle='', label=name)
ax.legend()
plt.show()

这个代码是我没想到的,这说明我对这个groupby的东西没太理解。这个说实话不错。

参考文章

[1]sentiment-analysis-with-keras-and-word-2-vec
[2]interactive-topic-mining

 类似资料: