По заданному списку слов и предложению найдите все слова, которые встречаются в предложении либо целиком, либо в виде подстроки.

Вот мой рабочий код, я использую angular4

Это ваша директива для верхнего регистра

import { Directive, ElementRef, HostListener } from '@angular/core';

@Directive({
  selector: '[appUpper]'
})
export class UpperDirective {

  constructor(public ref: ElementRef) { }

  @HostListener('input', ['$event']) onInput(event) {
    this.ref.nativeElement.value = event.target.value.toUpperCase();
  }

}

Это ваш html-код файла, в котором вы использовали прописную директиву

<input type="text" id="id" placeholder="id" tabindex="0" formControlName="id" appUpper>
9
задан thebenman 15 January 2019 в 16:43
поделиться

4 ответа

Хммм, а как насчет этого? Просто понять: d

import re

def WordsInText(text, words):
    found = []
    for index, item in enumerate(words):
        if (re.search(f'{item}', text, re.IGNORECASE) is not None):
            found.append(item)
    return found
0
ответ дан X4748 15 January 2019 в 16:43
поделиться

Расширение предложения @David Eisenstat для реализации этого с использованием алгоритма aho-corasick. Я нашел простой модуль Python ( pyahocorasic ), который может сделать это.

Вот как будет выглядеть код для примера, приведенного в вопросе.

import ahocorasick

def find_words(list_words, text):
    A = ahocorasick.Automaton()

    for key in list_words:
      A.add_word(key, key)

    A.make_automaton()

    result = []
    for end_index, original_value in A.iter(text):
      result.append(original_value)

    return result

list_words = ['red', 'hello', 'how are you', 'hey', 'deployed']
text = 'hello, This is shared right? how are you doing tonight'
print(find_words(list_words, text))

Или запустите его онлайн

0
ответ дан thebenman 15 January 2019 в 16:43
поделиться

Теоретически обоснованная версия того, что вы пытаетесь сделать, называется Ахо-Корасик . Реализация суффиксных ссылок является довольно сложной задачей IIRC, так что вот алгоритм, который просто использует три.

Мы употребляем текст по буквам. Мы всегда поддерживаем набор узлов в дереве, где может быть проход. Первоначально этот набор состоит только из корневого узла. Для каждой буквы мы перебираем узлы в наборе, спускаясь по новой букве, если это возможно. Если получающийся узел совпадает, замечательно, сообщите об этом. Независимо от этого, поместите его в следующий набор. Следующий набор также содержит корневой узел, так как мы можем начать новое сопоставление в любое время.

Вот моя попытка быстрой реализации на Python (без проверки, без гарантии и т. Д.).

class Trie:
    def __init__(self):
        self.is_needle = False
        self._children = {}

    def find(self, text):
        node = self
        for c in text:
            node = node._children.get(c)
            if node is None:
                break
        return node

    def insert(self, needle):
        node = self
        for c in needle:
            node = node._children.setdefault(c, Trie())
        node.is_needle = True


def count_matches(needles, text):
    root = Trie()
    for needle in needles:
        root.insert(needle)
    nodes = [root]
    count = 0
    for c in text:
        next_nodes = [root]
        for node in nodes:
            next_node = node.find(c)
            if next_node is not None:
                count += next_node.is_needle
                next_nodes.append(next_node)
        nodes = next_nodes
    return count


print(
    count_matches(['red', 'hello', 'how are you', 'hey', 'deployed'],
                  'hello, This is shared right? how are you doing tonight'))
0
ответ дан David Eisenstat 15 January 2019 в 16:43
поделиться

Если вы стремитесь к более быстрому коду, который зависит от текстового окна, вы можете пойти на поиски по множеству, чтобы ускорить процесс. Если возможно, замените список поиска на набор, а затем найдите все возможные окна в тексте, которые будут использоваться для поиска.

def getAllWindows(L):
    tracker = set()
    for w in range(1, len(L)+1):
        for i in range(len(L)-w+1):
            sub_window = L[i:i+w]
            if sub_window not in tracker:
                tracker.add(sub_window)
                yield sub_window


lookup_list = ['red', 'hello', 'how are you', 'hey', 'deployed']
lookup_set = set(lookup_list)
text = 'hello, This is shared right? how are you doing tonight'
result = [sub_window for sub_window in getAllWindows(text) if sub_window in lookup_list]
print(result)
#Output:
['red', 'hello', 'how are you']
0
ответ дан vivek_23 15 January 2019 в 16:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: