使用Python的单字模型

0 投票
2 回答
7348 浏览
提问于 2025-04-17 07:19

我正在尝试从一个文本文件中生成单个词(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

这段代码有一些明显的问题。

  1. ; 这个符号其实是不需要的。
  2. 导入的模块(比如 tokenize)没有被使用。这样做是可以的,但没什么意义。
  3. 用 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)

撰写回答