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

如何使用python搜索大型文本文件中是否包含来自句子的单词?

羊舌志
2023-03-14

我有一个包含单词及其引理的文本文件-每行第一列包含单词形式,第二列包含单词引理。

我有一个推文(句子)列表,我需要将其转换为单词引理-每个单词都需要转换为它们的引理(文本文件的第二列)

我试着打开和关闭每个单词的文本文件,但这需要很长时间(每个单词大约15秒才能在文本文件中找到它们的引理)。功能如下。

def returnLemma(str):
    str= word_tokenize(str)
    end_str = ""
    for word in str:
        infile = open('MorphDict.txt', 'r')
        for line in infile:
            line.strip()
            prva=line.split()[0] 
            druga=line.split()[1]
            if word==prva:
                end_str = end_str+" "+druga 
                break;
        infile.close()
    return end_str

可以搜索这个文本文件吗(

共有3个答案

步胜
2023-03-14

当需要比较两个列表的元素时,其中一个列表比另一个列表小得多,请在内部循环中使用最小的元素。这将永远更有效。

尽量不要做同样的工作两次。当你分割线时,保留部分,这样你就不需要再做了。

line.strip()不改变,而是生成一个没有空格的新行。使用line=line.strip()

您可以从头开始查找,而不是重复打开文件。

符俊材
2023-03-14

这是最终的工作代码——对od@Javier的函数做了微小的更改。谢谢大家的帮助,特别是贾维尔和马祖。

from nltk.tokenize import word_tokenize
from collections import defaultdict

def vratiLemu(s, morph_lines):
    tokens = word_tokenize(s)
    token_positions = defaultdict(list)
    for i, t in enumerate(tokens):
        token_positions[t].append(i)

    for line in morph_lines:
        line = line.strip()
        parts = line.split()
        prva = parts[0]
        try:
            positions = token_positions[prva]
        except KeyError:
            pass
        else:
            druga = parts[1]
            for i in positions:
                tokens[i] = druga

    return ' ' + ' '.join(druga for druga in tokens if druga is not None)              

morphDict= open('SveSrpMDANSI.txt', 'r')
out=vratiLemu1("Suštinsko pitanje nije postavljeno: zašto predsednik odbora nije otvorio pretres a morao je",morphDict)
print out

Suštinsko pitanje jesam postavljen:zašto predsednik odbor jesam otvoriti pretres a morati jeste

澹台华晖
2023-03-14

我会这样写同样的函数:

from collections import defaultdict


word_tokenize = lambda s: s.split()


def returnLemma(s, morph_lines):
    tokens = word_tokenize(s)
    token_positions = defaultdict(list)
    for i, t in enumerate(tokens):
        token_positions[t].append(i)

    drugas = [None] * len(tokens)
    for line in morph_lines:
        line = line.strip()
        parts = line.split(maxsplit=3)
        prva = parts[0]
        try:
            positions = token_positions[prva]
        except KeyError:
            pass
        else:
            druga = parts[1]
            for i in positions:
                drugas[i] = druga

    return ' ' + ' '.join(
        druga if druga is not None else token
        for token, druga in zip(tokens, drugas)
    )


import unittest


class ReturnLemmaTest(unittest.TestCase):

    def test_when_nothing_matches_then_it_returns_a_single_space(self):
        result = returnLemma('hello world', ['line 1', 'line 2'])
        self.assertEqual(' hello world', result)

    def test_when_one_line_matches_then_it_returns_its_second_word(self):
        result = returnLemma('hello world line-b', ['line-a 1', 'line-b 2'])
        self.assertEqual(' hello world 2', result)

    def test_when_many_lines_match_then_it_returns_their_second_words_separated_by_a_space(self):
        result = returnLemma('hello b world b c', ['a 0', 'b 1', 'c 2'])
        self.assertEqual(' hello 1 world 1 2', result)


if __name__ == '__main__':
    unittest.main()

returnLemma的第二个参数可以是一个打开的文件,但更容易用列表进行测试。

 类似资料:
  • 问题内容: 我到处都在寻找这个答案,但是找不到。 我正在尝试提出一个脚本,该脚本将搜索特定的子文件夹,然后检查其是否包含任何文件,如果有,则写出文件夹的路径。我已经弄清楚了子文件夹搜索部分,但是对文件的检查让我很困惑。 我发现了关于如何检查文件夹是否为空的多种建议,并且尝试修改脚本以检查文件夹是否为空,但是我没有得到正确的结果。 这是最接近的脚本: 这将列出所有空的子文件夹,但是如果我尝试将其更改

  • 问题内容: 如何使用Python 3搜索和替换文件中的文本? 这是我的代码: 输入文件: 当我在上面的输入文件中搜索并将“ ram”替换为“ abcd”时,它起了一种魅力。但是,反之亦然,即用“ ram”替换“ abcd”时,一些垃圾字符会保留在末尾。 用“ ram”代替“ abcd” 问题答案: fileinput已经支持就地编辑。stdout在这种情况下,它将重定向到文件:

  • 如果案文是: 我想要一个句子(句子边界是句号,后面是空格),其中有“他”和“米兰”,即第三个句子(顺序不重要。任何同时有这两个词的句子都是必需的) 我尝试了上面的regex pattrn和其他许多方法 但是它在'milan'之后提取部分句子,或者从第一个'he'开始提取两个句子 请建议使用regex或Java中的任何其他方法完成此任务的方法 (我正致力于提取2个实体之间的关系模式:在这种情况下,关

  • 虽然这不是一个直接的开发问题,但它确实与一个开发工具有关,这与我的开发工作非常相关: 当我在 VSCode (CTRL P) 中搜索文件时,我发现它不包含作为 .gitignore 文件一部分的文件和文件夹。 我可以很好地理解其中的逻辑,这很好,但我如何禁用它(默认设置?)行为也就是说,我确实希望这个搜索包括项目中的所有文件,而不管是.gitignore文件(还是其他任何忽略文件)。

  • 问题内容: 我使用XPather浏览器检查HTML页面上的XPATH表达式。 我的最终目标是在Selenium中使用这些表达式来测试用户界面。 我得到了一个HTML文件,其内容类似于以下内容: 我想选择一个包含字符串“ ” 的文本的节点。 使用“ abc”这样的普通字符串不会有问题。我使用类似于的XPATH 。 当我尝试使用类似的XPATH时,不会返回任何内容。关于带有“ ”的文本是否有特殊规定?

  • 问题内容: 我想检查字符串是否在文本文件中。如果是,请执行X。否则,请执行Y。但是,True由于某些原因,此代码始终返回。谁能看到错在哪里? 问题答案: 你一直得到的原因已经给出,因此我只提供另一个建议: 如果你的文件不是太大,则可以将其读取为字符串,然后使用它(比读取和检查每行更容易,并且通常更快): 另一个技巧:通过使用创建使用基础文件的“字符串状”对象(而不是读取内存中的整个文件),可以减轻