使用nltk的CSV中最常见的ngrams

时间:2017-05-03 09:55:36

标签: python nltk n-gram

我有一个带有百万+推文的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')

为什么附加[]?

1 个答案:

答案 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应用于列表。