擅长:python、mysql、java
<p>你需要调整你的算法。如前所述,它是O(n*m),<em>n</em>是关键字的,而<em>m</em>是文本的长度。这不会很好地扩大规模。在</p>
<p>取而代之的是:</p>
<ul>
<li>使<code>keywords</code>成为<code>set</code>,而不是<code>tuple</code>。您只关心针对<code>keywords</code>的成员身份测试,而set成员身份测试是O(1)。在</li>
<li>您需要标记<code>TEXT</code>。这比仅仅做<code>split()</code>要复杂一些,因为您还需要处理删除标点/换行符的操作。在</li>
<li>最后,使用“滑动窗口”迭代器,以3块为单位迭代标记。如果中间标记在<code>keywords</code>集中,请抓住它周围的标记并继续。在</li>
</ul>
<p>就这样。所以,一些伪代码:</p>
<pre><code>keywords = {"banana", "apple", "orange", ...}
tokens = tokenize(TEXT)
for before, target, after in window(tokens, n=3):
if target in keywords:
#do stuff with `before` and `after`
</code></pre>
<p>其中,<code>window</code>是您选择的类似于<a href="https://stackoverflow.com/questions/6822725/rolling-or-sliding-window-iterator-in-python">here</a>的滑动窗口实现,<code>tokenize</code>要么是您自己的涉及<code>split</code>和{<cd11>}的实现,或者如果您需要库解决方案,<code>ntlk.tokenize</code>。在</p>