Python:获取文字中最长的匹配关键字提及

时间:2019-06-13 09:38:44

标签: python nlp

我有一个关键字列表,包括它们的变体,我可以在诸如此类的文本中进行搜索:

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 :(得分:0)

# -*- 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)

答案 1 :(得分:0)

一种解决方案是使用后缀树获取提到的每个关键字的位置,然后按照@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

我只需要在每个关键字的两端添加空格,以避免出现包含关键字的单词,例如“ petrodollar”。结果是最长的相应提到的关键字的不重叠起始和结束位置。