使用Python的单字模型
我正在尝试从一个文本文件中生成单个词(unigram)。但是,程序只显示了文件第一行的双词组(bigram)。我想要显示文件中所有句子的单个词。
import string;
import sys;
import tokenize;
f = open("data.txt", 'r');
line=f.readline();
while line:
line = line.rstrip();
list = line.split();
for word in list:
print word
line = f.readline();
为什么没有显示句子的单个词?我该如何将其转换为双词组呢?
提前谢谢你。
data.txt 是包含句子的文本文件。里面有两句话 -
Hello world this is a test code
today is 29th november 2011
我得到的输出是:
Hello
world
this
is
a
test
代码
2 个回答
3
首先,如果你使用的是比较新的 Python 版本,你可以直接用 for line in f
这种写法,这比用 readline
要简单得多。而且你每行后面也不需要加 ;
,这个符号只有在你想把多条语句写在一行时才需要用。
下面的代码对我来说运行得很好:
f = open("data.txt", 'r')
for line in f:
for word in line.split():
print word
要生成一行的 bigram,像这样写就可以了(不过我没测试过!)
items = line.split()
bigrams = []
for i in xrange(len(items) - 1):
bigrams.append((items[i], items[i + 1]))
3
这段代码有一些明显的问题。
;
这个符号其实是不需要的。- 导入的模块(比如
tokenize
)没有被使用。这样做是可以的,但没什么意义。 - 用 while 循环来遍历文件的每一行,这样做虽然能工作,但感觉有点奇怪。
你没有展示文本文件的结构,但我假设每个句子都是在单独的一行上(也就是说,一个有两个句子的文本文件会有两行)。
我不太确定在这个情况下 bigram 到底指的是什么,所以你可能需要替换 bigram
这个函数。
from itertools import tee, izip
def bigrams(iterable):
a, b = tee(iterable)
next(b, None)
return izip(a, b)
with open("data.txt", 'r') as f:
for line in f:
words = line.strip().split()
uni = words
bi = bigrams(words)
print uni
print list(bi)