[英]How to search if large text file contains words from sentence using python?
我有一個包含單詞及其引理的文本文件 - 每行都包含第一列中的單詞形式和第二列中的單詞引理。
我有一個推文(句子)列表,我需要將其轉換為詞引理 - 每個單詞都需要轉換為其引理(文本文件的第二列)
我嘗試為每個單詞打開和關閉文本文件,但這需要太長時間(每個單詞在文本文件中找到它們的引理大約需要 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
是否可以更有效地搜索此文本文件 (>100MB)? 是否可以使用pandas 包來解決它?
我會像這樣編寫相同的函數:
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
的第二個參數可以是一個打開的文件,但用列表測試更容易。
這是最終的工作代碼 - 對@Javier 的功能進行了微小的更改。 感謝大家的幫助,尤其是@Javier 和@MaxU。
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
當您需要比較兩個列表的元素並且一個比另一個小很多時,請在內循環中使用最小的。 這總是會更有效率。
盡量不要兩次做同樣的工作。 分割線時,請保留零件,以便您不需要再次執行此操作。
line.strip()
不改變line
,而是生成一個沒有空格的新行。 使用line = line.strip()
。
您可以尋找到開頭,而不是反復打開文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.