我有一个带有百万+推文的csv文件。我已对数据进行了清理,我想找到文件中最常出现的2/3/4单词短语。
我将csv作为列表导入。重要的是在列表行中生成bigrams / trigrams。一世。即 列表: '莎莉很棒' '鲍勃不是'
Bigrams将会 ' Sally是','是伟大的',' Bob是','不是'
不'伟大的Bob' (即不应连接行)
以下是代码:
#import necessary packages
#read csv
with open("small_sample.csv", 'r') as f:
reader = csv.reader(f, delimiter=',')
dfl = list(reader)
#import ngrams function
from nltk import ngrams
#store bigrams in string_bigrams
string_bigrams=''
n=2
for line in dfl:
string_bigrams += ngrams(str(line).split(),n)
修改 由于我不能将+ =与生成器对象一起使用并将ngrams转换为字符串不能提供所需的结果,我使用itertools.chain添加到生成器对象。
更新代码:
for line in dfl:
string_bigrams
=itertools.chain(string_bigrams,ngrams(str(line).split(),n))
然而,这里的输出有' ['连接它。 一世。即如果列表保存为[' Sally很棒',' Bob不是'] string_bigrams返回
("['Sally", 'is')
('is', "great']")
("['Bob", 'is')
('is', "not']")
预期输出
('Sally', 'is')
('is', 'great')
('Bob', 'is')
('is', 'not')
为什么附加[]?
答案 0 :(得分:1)
("['Sally", 'is') ('is', "great']")
为什么附加[]?
这不只是括号,你也有杂散的引号。这显然来自于将str
应用于列表,新手Python程序员经常会做出错误而不是弄清楚它来自何处。
来自哪里必须是这样的:你的“csv文件”实际上没有列,每行只有一条消息。但csv
模块始终将每行的内容作为列的列表返回,这意味着变量line
是一个单元素列表,如下所示:
['Sally is great']
要解决此问题,请将string_bigrams
初始化为空列表并更改此
string_bigrams += ngrams(str(line).split(),n)
到此:
string_bigrams.extend( ngrams(line[0].split(), n) )
永远不会再将str
应用于列表。