2

有没有一种方法(模式或 Python 或 NLTK 等)来检测一个句子中是否有一个单词列表。

IE

The cat ran into the hat, box, and house.| The list would be hat, box, and house

这可以是字符串处理的,但我们可能有更通用的列表:

IE

The cat likes to run outside, run inside, or jump up the stairs.|

List=run outside, run inside, or jump up the stairs.

这可能在段落的中间或句子的末尾,这会使事情变得更加复杂。

我一直在使用 Pattern for python 并且我没有看到解决这个问题的方法,并且很好奇是否有使用模式或 nltk(自然语言工具包)的方法。

4

4 回答 4

3

根据我从您的问题中得到的信息,我认为您想搜索列表中的所有单词是否都出现在一个句子中。

一般要搜索一个列表元素,在一个句子中,可以使用allfunction。如果其中的所有参数都为真,则返回真。

listOfWords = ['word1', 'word2', 'word3', 'two words']
sentence = "word1 as word2 a fword3 af two words"

if all(word in sentence for word in listOfWords):
    print "All words in sentence"
else:
    print "Missing"

输出: -

"All words in sentence"

我认为这可能符合您的目的。如果没有,那么你可以澄清。

于 2012-10-26T19:48:12.887 回答
1

怎么用from nltk.tokenize import sent_tokenize

sent_tokenize("Hello SF Python. This is NLTK.")
["Hello SF Python.", "This is NLTK."]

然后,您可以通过这种方式使用该句子列表:

for sentence in my_list:
  # test if this sentence contains the words you want
  # using all() method 

更多信息在这里

于 2012-10-26T19:48:40.793 回答
1

使用Trie,您将能够实现 where is O(n)where nis the number of words in the words 建立一个 trie 与单词列表后,O(n)其中是列表中的单词n数。

算法

  • 将句子拆分为由空格分隔的单词列表。
  • 对于每个单词,检查它是否在 trie 中有一个键。即该词存在于列表中
    • 如果退出,则将该单词添加到结果中以跟踪列表中出现了多少单词在句子中
    • 跟踪具有 has subtrie 的单词,即当前单词是单词列表中较长单词的前缀
      • 对于这个单词中的每个单词,通过用当前单词扩展它可以看到它可以是单词列表中的一个键或一个 subtrie
    • 如果它是一个 subtrie,那么我们将它添加到 extend_words 列表中,并查看与下一个单词连接是否能够获得完全匹配。

代码

import pygtrie
listOfWords = ['word1', 'word2', 'word3', 'two words']

trie = pygtrie.StringTrie()
trie._separator = ' '
for word in listOfWords:
  trie[word] = True

print('s', trie._separator)

sentence = "word1 as word2 a fword3 af two words"
sentence_words = sentence.split()
words_found = {}
extended_words = set()

for possible_word in sentence_words:
  has_possible_word = trie.has_node(possible_word)

  if has_possible_word & trie.HAS_VALUE:
    words_found[possible_word] = True

  deep_clone = set(extended_words)
  for extended_word in deep_clone:
    extended_words.remove(extended_word)

    possible_extended_word = extended_word + trie._separator + possible_word
    print(possible_extended_word)
    has_possible_extended_word = trie.has_node(possible_extended_word)

    if has_possible_extended_word & trie.HAS_VALUE:
      words_found[possible_extended_word] = True

    if has_possible_extended_word & trie.HAS_SUBTRIE:
      extended_words.update(possible_extended_word)


  if has_possible_word & trie.HAS_SUBTRIE:
    extended_words.update([possible_word])

print(words_found)
print(len(words_found) == len(listOfWords))

如果您的单词列表很大并且您不希望每次都对其进行迭代,或者您对同一个单词列表有大量查询,这将非常有用。

代码在这里

于 2019-01-15T16:04:16.787 回答
0
all(word in sentence for word in listOfWords)
于 2012-10-26T19:55:25.943 回答