我有一个关键字列表,包括它们的变体,我可以在诸如此类的文本中进行搜索:
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)
,因为它是最长的匹配项,因此会返回“澳元”。如何获得其他匹配项(此处是“美元新闻...”中的“美元”和“美元”)?
答案 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”。结果是最长的相应提到的关键字的不重叠起始和结束位置。