python - FreqDist 用于最常见的单词或短语
问题描述
我正在尝试分析来自应用评论的一些数据。
我想使用 nltk 的 FreqDist 来查看文件中出现频率最高的短语。它可以是单个标记或关键短语。我不想标记数据,因为那只会给我最常见的标记。但是现在,FreqDist 函数将每条评论作为一个字符串处理,而不是提取每条评论中的单词。
df = pd.read_csv('Positive.csv')
def pre_process(text):
translator = str.maketrans("", "", string.punctuation)
text = text.lower().strip().replace("\n", " ").replace("’", "").translate(translator)
return text
df['Description'] = df['Description'].map(pre_process)
df = df[df['Description'] != '']
word_dist = nltk.FreqDist(df['Description'])
(“描述”是评论的正文/信息。)
例如,我想得到最常见的词:“我喜欢”、“有用”、“非常好的应用”,但我得到的是最常见的词:“我真的很喜欢这个应用,因为 bablabla”(完整评论)
这就是为什么当我绘制 FreqDist 时我得到这个:
解决方案
TL;博士
使用ngrams
或everygrams
:
>>> from itertools import chain
>>> import pandas as pd
>>> from nltk import word_tokenize
>>> from nltk import FreqDist
>>> df = pd.read_csv('x')
>>> df['Description']
0 Here is a sentence.
1 This is a foo bar sentence.
Name: Description, dtype: object
>>> df['Description'].map(word_tokenize)
0 [Here, is, a, sentence, .]
1 [This, is, a, foo, bar, sentence, .]
Name: Description, dtype: object
>>> sents = df['Description'].map(word_tokenize).tolist()
>>> FreqDist(list(chain(*[everygrams(sent, 1, 3) for sent in sents])))
FreqDist({('sentence',): 2, ('is', 'a'): 2, ('sentence', '.'): 2, ('is',): 2, ('.',): 2, ('a',): 2, ('Here', 'is', 'a'): 1, ('a', 'foo'): 1, ('a', 'sentence'): 1, ('bar', 'sentence', '.'): 1, ...})
推荐阅读
- r - 在R中的两列中找到唯一的单词对,忽略它们的顺序
- hadoop-yarn - 什么是 Amazon Snowflake 执行引擎
- perforce - IBM IID 8.5 基于什么版本的Eclipse
- django - 在“静态”中还包括使用外部源加载静态文件的域和协议
- java - 如何修复 BroadcastReceiver 中的重复值?
- neo4j - Neo4j:“ga.nlp.ml.word2vec.addModel”不起作用
- javascript - 将活动类添加到当前元素
- python-3.x - 如何在 Python 中绕过企业防火墙后面的“SLError:HTTPSConnectionPool”
- c++ - 无法理解 cmake find_package 行为
- javascript - 在分辨率之间转换像素坐标