当前位置: 首页 > 知识库问答 >
问题:

单词

伍弘盛
2023-03-14

我最初在这里发布了这个问题,但后来被告知将其发布到代码审查;然而,他们告诉我,我的问题需要在这里发布。我会试着更好地解释我的问题,希望没有混淆。我正在尝试编写一个单词一致性程序,它将执行以下操作:

1) 读“停”字。txt文件放入一个只包含停止词的字典(使用与您计时的字典类型相同的字典),称为stopWordDict。(警告:在将换行符('\n')添加到stopWordDict之前,请先将其从停止字的末尾删除)

2) 处理战争与和平。txt文件一次一行,以构建单词一致性词典(称为wordConcordanceDict),其中包含键的“主要”单词,并将其关联的行号列表作为其值。

3)按字母顺序遍历单词ConcordanceDector,生成包含按字母顺序打印出的一致性单词及其相应行号的文本文件。

我在一个小文件上测试了我的程序,上面有一个简短的停止词列表,它工作正常(下面提供了一个例子)。结果是我所期望的,一个包含行数的主要单词列表,不包括stop_words_small.txt文件中的单词。我测试的小文件和我实际上试图测试的主文件之间的唯一区别是主文件要长得多,并且包含标点符号。所以我遇到的问题是,当我用主文件运行我的程序时,我得到了比预期更多的结果。我得到比预期更多结果的原因是因为标点符号没有从文件中删除。

例如,下面是结果的一部分,其中我的代码将Dmitri作为四个独立的单词计算,因为单词后面的大小写和标点符号不同。如果我的代码正确地删除标点符号,单词Dmitri将被算作一个单词,后面跟着所有找到的位置。我的输出也是分隔大小写单词,所以我的代码也没有使文件小写。

我的代码当前显示的内容:

Dmitri : [2528, 3674, 3687, 3694, 4641, 41131]

Dmitri! : [16671, 16672]

Dmitri, : [2530, 3676, 3685, 13160, 16247]

dmitri : [2000]

我的代码应该显示什么:

dmitri : [2000, 2528, 2530, 3674, 3676, 3685, 3687, 3694, 4641, 13160, 16671, 16672, 41131]

单词被定义为由任何非字母分隔的字母序列。大写字母和小写字母之间也应该没有区别,但我的程序也会将它们分开;但是,空行应计入行号中。

下面是我的代码,如果有人能看一下,并给我任何关于我做错了什么的反馈,我将不胜感激。提前谢谢你。

import re

def main():
    stopFile = open("stop_words.txt","r")
    stopWordDict = dict()

    for line in stopFile:
        stopWordDict[line.lower().strip("\n")] = []

    hwFile = open("WarAndPeace.txt","r")
    wordConcordanceDict = dict()
    lineNum = 1

    for line in hwFile:
        wordList = re.split(" |\n|\.|\"|\)|\(", line)
        for word in wordList:
            word.strip(' ')
            if (len(word) != 0) and word.lower() not in stopWordDict:
                if word in wordConcordanceDict:
                    wordConcordanceDict[word].append(lineNum)
                else:
                    wordConcordanceDict[word] = [lineNum]
        lineNum = lineNum + 1

    for word in sorted(wordConcordanceDict):
        print (word," : ",wordConcordanceDict[word])


if __name__ == "__main__":
main()

这里的另一个例子和参考是我用完美工作的停止词的小列表测试的小文件。

stop_words_small.txt档案

a, about, be, by, can, do, i, in, is, it, of, on, the, this, to, was

small_file.txt

This is a sample data (text) file to
be processed by your word-concordance program.

The real data file is much bigger.

正确输出

bigger: 4

concordance: 2

data: 1 4

file: 1 4

much: 4

processed: 2

program: 2

real: 4

sample: 1

text: 1

word: 2

your: 2

共有1个答案

韦睿
2023-03-14

你可以这样做:

import re
from collections import defaultdict

wordConcordanceDict = defaultdict(list)

with open('stop_words_small.txt') as sw:
    words = (line.strip() for line in sw)
    stop_words = set(words)

with open('small_file.txt') as f:
    for line_number, line in enumerate(f, 1):
        words = (re.sub(r'[^\w\s]','',word).lower() for word in line.split())
        good_words = (word for word in words if word not in stop_words)
        for word in good_words:
            wordConcordanceDict[word].append(line_number)

for word in sorted(wordConcordanceDict):
    print('{}: {}'.format(word, ' '.join(map(str, wordConcordanceDict[word]))))

输出:

bigger: 4
data: 1 4
file: 1 4
much: 4
processed: 2
program: 2
real: 4
sample: 1
text: 1
wordconcordance: 2
your: 2

明天我会补充说明,这里时间不早了;)。同时,如果代码的某些部分对您来说不清楚,您可以在注释中询问。

 类似资料:
  • 问题内容: 我是Java的新手,我需要列出列表列表。我可以在python中做到这一点,因为列表的元素可以是列表,因此在嵌入式列表中将引用列表,并且将引用嵌入式列表的zeroeth元素。有什么简单的方法可以在Java中实现此行为? 问题答案: 所有其他答案在技术上都是正确的,但是恕我直言,如果您实施了粗略的列表列表,您将无法在正确的抽象级别上处理数据。例如,我很确定列表列表在您的业务领域中已经意味着

  • 我想从文件。 示例: 我想给我们一种动态命令,因为我不必每次为每个用户手动输入。 我试过了 但这并没有达到预期的效果。

  • 问题内容: 我想使用PHP将文本拆分成单个单词。你有什么想法要实现吗? 我的方法: 这是一个好方法吗?您有改进的想法吗? 提前致谢! 问题答案: 使用与任何Unicode标点符号匹配的\ p {P}类和\ s空格类。 这将拆分为一组一个或多个空格字符,但也会吸收周围的所有标点符号。它还在字符串的开头或结尾匹配标点符号。这区分了诸如“不要”和“他说’哎呀!’”之类的情况。

  • 在我的数据框架中,有一列名为“teams”。它包括城市和球队名称。我想把这个城市拉进另一个纵队。这是数据帧:数据帧示例 我可以使用正则表达式轻松提取列: 然而,在“名称”栏中,对于纽约尼克斯队,它只给了我“New”的值,我想得到“New York”: 结果 那么,我该怎么做呢?如果单元格有2个单词,我该如何从开头只提取一个单词?如果单元格有3个单词,我该如何使用正则表达式从中提取2个单词?

  • 问题内容: 目标:从所有行内的定位标记中提取文本并将其放入csv中。 我正在尝试以下代码: 它工作正常,但csv中的每个单元格仅包含一个字符。 像这样: 代替: 我当然想念什么。但是呢 问题答案: 接受一个序列。您只给它一个字符串,因此将其视为一个序列,字符串的作用类似于字符序列。 您还要在此行中还有什么?没有?如果是这样,请使其成为一项的列表: (顺便说一句,由于您已经加入了Unicode分隔符

  • <Ctrl+n> 下一个匹配项 <Ctrl+p> 上一个匹配项 您可以在配置文件中定义补全的方式 "自动补全方式:(使用逗号分隔) set complete=k,. " . 当前文件 " b 已被装缓冲区,但是没有在窗口内的文件 " d 在当前的文件中定义和由 #include 包含进来的文件 " i 由 #include 包含进来的文件 " k