Как создать дерево поиска для персидского текста? - PullRequest
2 голосов
/ 27 февраля 2020

Я хочу очистить персидский текст от стоп-слов. У меня уже есть данные о стоп-словах, которые приведены по ссылке ниже. Мне кажется, если бы у меня было готовое дерево на стоп-словах, я мог бы сэкономить много времени. Я хочу найти каждое слово текста в этом предварительно построенном дереве, если слово находится в дереве, я удаляю его из текста, если нет, то удерживаю его.

O (n * l) до O ( n * log (l)).

Это мои стоп-слова

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

1 Ответ

1 голос
/ 27 февраля 2020

Это ответ с деревом шин:

чтение данных:

#readindg stopword data
stopwords = pd.read_csv('STOPWORDS',header=None)

дерево шин:

#creating tire tree
class TrieNode: 

    # Trie node class 
    def __init__(self): 
        self.children = [None]*15000

        # isEndOfWord is True if node represent the end of the word 
        self.isEndOfWord = False

class Trie: 

    # Trie data structure class 
    def __init__(self): 
        self.root = self.getNode() 

    def getNode(self): 

        # Returns new trie node (initialized to NULLs) 
        return TrieNode() 

    def _charToIndex(self,ch): 

        # private helper function 
        # Converts key current character into index 
        # use only 'a' through 'z' and lower case 

        return ord(ch)-ord('!') 


    def insert(self,key): 

        # If not present, inserts key into trie 
        # If the key is prefix of trie node, 
        # just marks leaf node 
        pCrawl = self.root 
        length = len(key) 
        for level in range(length): 
            index = self._charToIndex(key[level]) 

            # if current character is not present 
            if not pCrawl.children[index]: 
                pCrawl.children[index] = self.getNode() 
            pCrawl = pCrawl.children[index] 

        # mark last node as leaf 
        pCrawl.isEndOfWord = True

    def search(self, key): 

        # Search key in the trie 
        # Returns true if key presents 
        # in trie, else false 
        pCrawl = self.root 
        length = len(key) 
        for level in range(length): 
            index = self._charToIndex(key[level]) 
            if not pCrawl.children[index]: 
                return False
            pCrawl = pCrawl.children[index] 

        return pCrawl != None and pCrawl.isEndOfWord 

Пример использования:

# Input keys (use only 'a' through 'z' and lower case) 
keys = list(stopwords.loc[:,0])

output = ["Not present in trie", 
        "Present in trie"] 

# Trie object 
t = Trie() 

# Construct trie 
for key in keys: 
    t.insert(key) 


print("{} ---- {}".format("از",output[t.search("از")])) 

Выход:

از ---- Present in trie
...