我有一个包含单词及其引理的文本文件-每行第一列包含单词形式,第二列包含单词引理。
我有一个推文(句子)列表,我需要将其转换为单词引理-每个单词都需要转换为它们的引理(文本文件的第二列)
我试着打开和关闭每个单词的文本文件,但这需要很长时间(每个单词大约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
可以搜索这个文本文件吗(
当需要比较两个列表的元素时,其中一个列表比另一个列表小得多,请在内部循环中使用最小的元素。这将永远更有效。
尽量不要做同样的工作两次。当你分割线时,保留部分,这样你就不需要再做了。
line.strip()
不改变行
,而是生成一个没有空格的新行。使用line=line.strip()
。
您可以从头开始查找,而不是重复打开文件。
这是最终的工作代码——对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
我会这样写同样的函数:
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个实体之间的关系模式:在这种情况下,关
问题内容: 我使用XPather浏览器检查HTML页面上的XPATH表达式。 我的最终目标是在Selenium中使用这些表达式来测试用户界面。 我得到了一个HTML文件,其内容类似于以下内容: 我想选择一个包含字符串“ ” 的文本的节点。 使用“ abc”这样的普通字符串不会有问题。我使用类似于的XPATH 。 当我尝试使用类似的XPATH时,不会返回任何内容。关于带有“ ”的文本是否有特殊规定?
虽然这不是一个直接的开发问题,但它确实与一个开发工具有关,这与我的开发工作非常相关: 当我在 VSCode (CTRL P) 中搜索文件时,我发现它不包含作为 .gitignore 文件一部分的文件和文件夹。 我可以很好地理解其中的逻辑,这很好,但我如何禁用它(默认设置?)行为也就是说,我确实希望这个搜索包括项目中的所有文件,而不管是.gitignore文件(还是其他任何忽略文件)。
问题内容: 我想检查字符串是否在文本文件中。如果是,请执行X。否则,请执行Y。但是,True由于某些原因,此代码始终返回。谁能看到错在哪里? 问题答案: 你一直得到的原因已经给出,因此我只提供另一个建议: 如果你的文件不是太大,则可以将其读取为字符串,然后使用它(比读取和检查每行更容易,并且通常更快): 另一个技巧:通过使用创建使用基础文件的“字符串状”对象(而不是读取内存中的整个文件),可以减轻