Python: получите самые длинные соответствующие ключевые слова упоминания в тексте - PullRequest
3 голосов
/ 13 июня 2019

У меня есть список ключевых слов, включая их варианты, которые я ищу в тексте, например:

keywords = ['US Dollar', 'Australian Dollar', 'Dollar', 'Dollars']

и я хочу найти эти ключевые слова в таких текстах, как:

«Новости доллара: австралийский доллар упал на фоне восстановления доллара США»

и получите наиболее полные совпадения (т. Е. Самые длинные): «Доллар» в начале предложения, а также «Австралийский доллар» и «Доллар США» (например, не «Доллар» в этих случаях).

Я до сих пор пробовал это:

keywords.sort(key = len, reverse=True)

first = lambda text, kws: next((k for k in kws if k in text), None)

first(myText, keywords)

, который возвращает «Австралийский доллар», так как это самый длинный матч. Как я могу получить другие совпадения (здесь, «Доллар» в «Доллар Ньюс ...» и «Доллар США»)?

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Решение состоит в том, чтобы использовать суффиксные деревья, чтобы получить позиции каждого упоминания ключевого слова, а затем обработать перекрытие, как предложено @EricDuminil.

Вот моя функция для извлечения позиций kws ключевых слов в текстовом источникеtxt:

from suffix_trees import STree

def findMentions(txt, kws):

    st = STree.STree(txt)
    spans = []

    for kw in kws:
        starts = st.find_all(kw)
        spans.extend([(item, item+len(kw)) for item in starts])

    bounds = handleOverlap(spans)

    return bounds

и вот функция для обработки перекрывающихся позиций символов:

def handleOverlap(spans):
    del_in = []
    for x in spans:
        if spans.index(x) in del_in: continue
        for y in spans:
            if spans.index(y) in del_in: continue
            if x == y: continue
            if len(set(list(range(x[0],x[1]+1))) & set(list(range(y[0],y[1]+1)))) > 0:
                if len(list(range(x[0],x[1]+1))) > len(list(range(y[0],y[1]+1))):
                    del_in.append(spans.index(y))
                    spans.pop(spans.index(y))
                elif len(list(range(y[0],y[1]+1))) > len(list(range(x[0],x[1]+1))):
                    del_in.append(spans.index(x))
                    spans.pop(spans.index(x))
    return spans

Мне просто нужно было добавить пробелы в оба конца каждого ключевого слова, чтобы избежать получения словсодержит ключевое слово, например, «нефтедоллар».Результатом являются неперекрывающиеся начальная и конечная позиции для самых длинных из упомянутых ключевых слов.

0 голосов
/ 13 июня 2019
# -*- coding: utf-8 -*-
"""
Created on Thu Jun 13 14:21:59 2019

@author: jainil
"""
keywords = ['US Dollar', 'Australian Dollar', 'Dollar', 'Dollars']
keywords.sort(key = len, reverse=True)
keywords

text='The Australian Dollar slumped in the face of a recovering US Dollar'
dictt={}
for i in keywords:
    dictt[i]=text.count(i)

max_len=0
max_value=0
for i in dictt.keys():
    if len(i.split())>max_len and dictt[i]>0:
        max_len= len(i.split())
        if(dictt[i]>max_value):
            max_value=dictt[i]



for i,j in dictt.items():
    if(len(i.split())==max_len and j==max_value):
        print(i,j)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...