Python N_gram频率计数

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (258)

我有一个pandas数据框,我想基于一个文本列做2-gram频率。

text_column
This is a book
This is a book that is read
This is a book but he doesn't think this is a book

最终的结果是频率计数为2克,频率计算每个文件中是否有2克,而不是2克计数。

所以部分结果会是

2 gram         Count
This is          3
a book           3

“这是”和“一本书”出现在所有3个文本中,尽管第3个文本中每个都有2个,因为我只感兴趣这些2克出现了多少文件,计数是3而不是4。

知道我怎么能这样做吗?

谢谢

提问于
用户回答回答于

Pythonic的答案(写得一般所以可以应用于文件/数据框/无论如何):

c=collections.Counter()
for i in fh:
  x = i.rstrip().split(" ")
  c.update(set(zip(x[:-1],x[1:])))

现在c保持每2克的频率。

说明:

  1. 每一行都是split通过空格进入列表。
  2. 然后zip()返回一个长度为2(2克)的元组的迭代器。
  3. 迭代器被输入a set()以便去除冗余。
  4. 然后将该集合馈入一个collections.Counter()对象,该对象跟踪每个元组出现的次数。你需要import collections使用它。
  5. 现在很容易列出计数器的内容或将其转换为您喜欢的任何其他格式(例如数据帧)。

是的,Python太棒了。

用户回答回答于

这是非常C风格,但有效。想法是跟踪每个文档的“当前”bigrams,确保它们每个doc(cur_bigrams = set())只添加一次,并且在每个文档之后,bigram_freq如果它在当前文档中,则递增全局freq计数器()。然后在bigram_freq整个文档的全局计数器中构建一个新的数据帧。

bigram_freq = {}
for doc in df["text_column"]:
    cur_bigrams = set()
    words = doc.split(" ")
    bigrams = zip(words, words[1:])
    for bigram in bigrams:
        if bigram not in cur_bigrams: # Add bigram, but only once/doc
            cur_bigrams.add(bigram)
    for bigram in cur_bigrams:
        if bigram in bigram_freq:
            bigram_freq[bigram] += 1
        else:
            bigram_freq[bigram] = 1

result_df = pd.DataFrame(columns=["2_gram", "count"])
row_list = []
for bigram, freq in bigram_freq.items():
    row_list.append([bigram[0] + " " + bigram[1], freq])
for i in range(len(row_list)):
    result_df.loc[i] = row_list[i]

print(result_df)

输出:

           2_gram count
0          a book     3
1            is a     3
2         This is     3
3         is read     1
4         that is     1
5       book that     1
6      he doesn't     1
7         this is     1
8        book but     1
9          but he     1
10     think this     1
11  doesn't think     1

您可以使用更实用的样式和/或列表推导来减少代码。我将把它作为练习留给读者。

所属标签

可能回答问题的人

  • 人生的旅途

    10 粉丝484 提问5 回答
  • 无聊至极

    4 粉丝504 提问5 回答
  • 富有想象力的人

    4 粉丝0 提问4 回答
  • 嗨喽你好

    7 粉丝480 提问4 回答

扫码关注云+社区

领取腾讯云代金券