簡體   English   中英

搜索字符串列表,並確定單獨的字符串列表中是否存在完全匹配的字符串。 蟒蛇。 情緒分析

[英]Search through list of strings and determine if there is an exact match in separate list of strings. python. sentiment analysis

假設我有一個關鍵字列表和一個句子列表:

keywords = ['foo', 'bar', 'joe', 'mauer']
listOfStrings = ['I am frustrated', 'this task is foobar', 'mauer is awesome']

如何遍歷listOfStrings並確定它們是否包含任何關鍵字...必須完全匹配! 這樣:

>>for i in listOfStrings:
    for p in keywords:
       if p in i:
         print i

>> 'mauer is awesome'

(由於'foobar'與'foo'或'bar'不完全匹配,因此,如果該函數是關鍵字,則函數應僅捕獲'foobar')

我懷疑re.search可能是這樣,但是我無法弄清楚如何使用變量而不是使用re模塊的逐字表達式來遍歷列表。
謝謝

完全匹配的一個更好的主意是將關鍵字存儲在集合中

keywords = {'foo', 'bar', 'joe', 'mauer'}
listOfStrings = ['I am frustrated', 'this task is foobar', 'mauer is awesome']

[s for s in listOfStrings if any(w in keywords for w in s.split())]

這只會測試listOfStrings每個單詞一次。 您的方法(或使用正則表達式)查看listOfStrings每個關鍵字的每個單詞。 隨着關鍵字數量的增加,效率將非常低下。

如果用正則表達式元字符\\b包圍單詞,然后將其用作正則表達式,則需要在單詞邊界處進行匹配:

http://www.regular-expressions.info/wordboundaries.html

元字符\\ b是類似於插入符號和美元符號的錨。 它在稱為“單詞邊界”的位置匹配。 此匹配為零長度。

另外,請確保您的python正則表達式使用re.IGNORECASEhttp : re.IGNORECASE

並且不要忘記\\在語言的字符串解析器和正則表達式引擎本身中都可以被視為元字符,這意味着必須將其加倍為\\\\b

無需檢查每個關鍵字是否包含在字符串中的任何位置,而是可以將句子分解為單詞,然后檢查每個單詞是否都是關鍵字。 這樣一來,部分匹配就不會有問題。

在此, RE_WORD被定義為單詞邊界的正則表達式,至少一個字符,然后是另一個單詞邊界。 您可以使用re.findall()查找字符串中的所有單詞。 re.compile()預編譯正則表達式,這樣就不必從頭開始解析每一行。

frozenset()是一種高效的數據結構 ,它可以通過掃描一長串關鍵字並嘗試每個關鍵字來更快地回答“凍結集中的給定單詞?”這個問題。

#!/usr/bin/env python2.7

import re

RE_WORD = re.compile(r'\b[a-zA-Z]+\b')

keywords = frozenset(['foo', 'bar', 'joe', 'mauer'])
listOfStrings = ['I am frustrated', 'this task is foobar', 'mauer is awesome']

for i in listOfStrings:
    for word in RE_WORD.findall(i):
        if word in keywords:
            print i
            continue

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM