0

我有一个 CSV 文件,如下所示:

Lorem ipsum dolor sit amet , 12:01
consectetuer adipiscing elit, sed , 12:02

ETC...

这是一个相当大的文件(大约 10,000 行)我想将所有文本行的总词汇量放在一起。也就是说,忽略第二列(时间),将所有内容小写,然后计算不同单词的数量。

问题:1)如何分隔每行中的每个单词 2)如何将所有内容小写并删除非字母字符。

到目前为止,我有以下代码:

import csv
with open('/Users/file.csv', 'rb') as file:
    vocabulary = []
    i = 0
    reader = csv.reader(file, delimiter=',')
    for row in reader:
        for word in row:
            if row in vocabulary:
                break
            else:
                vocabulary.append(word)
                i = i +1
print i

谢谢您的帮助!

4

2 回答 2

3

Python csv 模块是一个很棒的库,但经常将它用于更简单的任务可能是矫枉过正。对我来说,这种特殊情况是一个典型的例子,使用 csv 模块可能会使事情变得过于复杂

大部头书,

  • 只是遍历文件,
  • 用逗号分割每一行,并提取第一个分割
  • 然后在空白处分割剩余部分
  • 将每个单词转换为小写
  • 去掉所有的标点符号和数字
  • 并将结果理解为一组

是一种线性的直接方法

使用以下文件内容运行的示例

Lorem Ipsum is simply dummy "text" of the ,0
printing and typesetting; industry. Lorem,1
 Ipsum has been the industry's standard ,2
dummy text ever since the 1500s, when an,3
 unknown printer took a galley of type and,4
 scrambled it to make a type specimen ,5
book. It has survived not only five ,6
centuries, but also the leap into electronic,7
typesetting, remaining essentially unch,8
anged. It was popularised in the 1960s with ,9
the release of Letraset sheets conta,10
ining Lorem Ipsum passages, and more rec,11
ently with desktop publishing software like,12
 !!Aldus PageMaker!! including versions of,13
Lorem Ipsum.,14

>>> from string import digits, punctuation
>>> remove_set = digits + punctuation
>>> with open("test.csv") as fin:
    words = {word.lower().strip(remove_set) for line in fin
         for word in line.rsplit(",",1)[0].split()}


>>> words
set(['and', 'pagemaker', 'passages', 'sheets', 'galley', 'text', 'is', 'in', 'it', 'anged', 'an', 'simply', 'type', 'electronic', 'was', 'publishing', 'also', 'unknown', 'make', 'since', 'when', 'scrambled', 'been', 'desktop', 'to', 'only', 'book', 'typesetting', 'rec', "industry's", 'has', 'ever', 'into', 'more', 'printer', 'centuries', 'dummy', 'with', 'specimen', 'took', 'but', 'standard', 'five', 'survived', 'leap', 'not', 'lorem', 'a', 'ipsum', 'essentially', 'unch', 'conta', 'like', 'ining', 'versions', 'of', 'industry', 'ently', 'remaining', 's', 'printing', 'letraset', 'popularised', 'release', 'including', 'the', 'aldus', 'software'])
于 2013-01-21T16:02:28.847 回答
1

你几乎有你需要的东西。缺少的一点是小写转换,可以简单地用word.lower().

您缺少的另一件事是拆分成单词。你应该使用.split()这个任务,默认情况下分割每个空白字符,即空格、制表符等。

您将遇到的一个问题是区分文本中的逗号和列分隔逗号。也许不使用 csv-reader 而是简单地读取每一行并删除时间,然后将其拆分为单词。

import re

with open('/Users/file.csv', 'rb') as file:
    for line in file:
        line = re.sub(" , [0-2][0-9]:[0-5][0-9]", "", line)
        line = re.sub("[,|!|.|?|\"]", "", line)
        words = [w.lower() for w in line.split()]
        for word in words:
            ...

如果要删除其他字符,请将它们包含在第二个正则表达式中。如果性能对您很重要,您应该在for循环之前编译两个正则表达式。

于 2013-01-21T15:39:26.243 回答