使用 nltk 的 CSV 中最常见的 ngram

Most frequent ngrams in a CSV using nltk

我有一个包含数百万条推文的 csv 文件。我已经清理了数据,我想找到整个文件中出现频率最高的 2 / 3 / 4 词短语。

我正在将 csv 作为列表导入。重要的是在列表行内生成二元组/三元组。一世。 e. 列表: 'Sally is great' 'Bob is not'

二元组将是 'Sally is'、'is great'、'Bob is'、'is not'

不是 'great 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)

编辑 由于我不能将 += 与生成器对象一起使用,并且将 ngram 转换为字符串不会给出所需的结果,因此我使用 itertools.chain 添加到生成器对象。

更新代码:

for line in dfl:
    string_bigrams 
    =itertools.chain(string_bigrams,ngrams(str(line).split(),n))

但是,此处的输出与“[”相连。 一世。 e.如果列表保存为 ['Sally is great','Bob is not'] string_bigrams returns

("['Sally", 'is')
('is', "great']")
("['Bob", 'is')
('is', "not']")

预期输出为

('Sally', 'is')
('is', 'great')
('Bob', 'is')
('is', 'not')

为什么要附加 []?

("['Sally", 'is')
('is', "great']")

Why are the [] appended?

不仅是括号,还有杂散的引号。这显然来自将 str 应用于列表,新手 Python 程序员经常这样做是为了掩盖错误,而不是弄清楚错误的来源。

它的来源肯定是这样的:您的 "csv file" 实际上没有栏,每行只有一条消息。但是 csv 模块总是 returns 每一行的内容作为一个 list 的列,这意味着变量 line 是一个单元素列表看起来像这样:

['Sally is great']

要解决此问题,请将 string_bigrams 初始化为空 列表 并更改此

string_bigrams += ngrams(str(line).split(),n)

对此:

string_bigrams.extend( ngrams(line[0].split(), n) ) 

永远永远不要再将 str 应用于列表。