-
Notifications
You must be signed in to change notification settings - Fork 1
/
analyser.py
198 lines (177 loc) · 13.7 KB
/
analyser.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
import re
class TextAnalyser:
def __find_reports(self, text):
patterns = [r"\bگزارش (\w+ \w+)\b"]
reports = []
for pattern in patterns:
for matched in re.finditer(pattern, text):
if matched is not None:
reports.append({
'type': 'گزارش',
'marker': matched.group(1),
'span': [x + 1 for x in matched.span()]
})
return reports
def __find_events(self, text):
# a = ["ضرر", "سود", "اطلاعیه", "حقیق", "حقوق", "افزایش", "سرمایه", "تقسیم", "سود", "دامنه", "نوسان", "شدید", "سهم", "رانت"]
numbers = {
'یک': '1', 'دو': '2', 'سه': '3', 'چهار': '4', 'پنج': '5', 'شش': '6', 'هفت': '7', 'هشت': '8', 'نه': '9',
'ده': '10',
'یازده': '11', 'دوازده': '12', 'سیزده': '13', 'چهارده': '14', 'پانزده': '15', 'شانزده': '16', 'هفده': '17',
'هجده': '18', 'نوزده': '19',
'بیست': '20', 'سی': '30', 'چهل': '40', 'پنجاه': '50', 'شصت': '60', 'هفتاد': '70', 'هشتاد': '80',
'نود': '90',
'صد': '100', 'دویست': '200', 'سیصد': '300', 'پانصد': '500', 'چهارصد': '400', 'ششصد': '600', 'هفتصد': '700',
'هشتصد': '800', 'نهصد': '900', 'یکصد': '100'
}
patterns = [# افشای الف
r"\b((افشا|افشای) (الف|ب))\b",
# پنجاه درصد رشد
r"\b(((\S+) ){1,2}(تومان|تومن|درصد|واحد|ریال) ((\S+) ){0,2}(مثبت|منفی|رشد|سود|افزایش|کاهش))\b",
# رشد 3 درصدی
r"\b((مثبت|منفی|رشد|سود|افزایش|کاهش) ((\S+) ){0,5}(درصدی|واحدی|درصد|واحد))\b",
# حقیقی ها به بازار پول تزریق کردند
r"\b((حقیقی|حقوقی|حقیقی ها|حقوقی ها) ((\S+) ){0,3}(ورود|وارد|خروج|خارج|تزریق) (\S+))\b",
# ورود پول حقیقی
r"\b((ورود|وارد|خروج|خارج|تزریق) ((\w+) ){0,2}(حقیقی|حقوقی))\b",
# به ... رسید | از .. عبور
#به محدوده ۴۰۱ هزار و ۴۳۶ واحدی رسید
r"\b((به|از) ((\S+) ){0,7}(عبور|رسید))\b",
# واگذاری 5 درصد از سهام
r"\b((واگذاری) ((\S+) ){0,3}(سهام|سهم))\b",
# کلمات کلیدی
r"\b((صف خرید|صف فروش|اطلاعیه|تقسیم سود|دامنه نوسان|نوسان شدید|سهم رانتی|سبزپوش))\b",
#کلمات کلیدی + .... + عدد(optional)
r"((اصلاح|روند مثبت|نوسان|افزایش سرمایه|روند صعودی|روند نزولی|کف سازی)( ((\S+) ){0,4}(\d+) ?(تومان|تومن|درصد|واحد|ریال)?)?)",
#کلمات کلیدی + ... + عدد(اجباری)
r"((تارگت|مقاومت|شکست|هدف|قیمت|میانگین|دلار|تراز|نرخ|برگشت|نوسان|ریزش|صعود|نزول|تثبیت)( ((\S+) ){0,4}(\d+) ?(تومان|تومن|درصد|واحد|ریال)?))"
]
events = []
for pattern in patterns:
for matched in re.finditer(pattern, text):
if matched is not None:
events.append({
'type': 'واقعه',
'marker': str(matched.group(1)),
'span': [x + 1 for x in matched.span()]
})
return events
def __find_symbols(self, text):
def find_name(text):
for name in symbols_data['name']:
if name == 'دی ':
if text.startswith('دی ') or len(re.findall(' دی ', text)) != 0:
symbols.append({
'type': 'نماد',
'marker': 'دی',
'span': ''
})
continue
matched = re.findall(name, text)
if len(matched) != 0:
for name_symbol in matched:
symbols.append({
'type': 'نماد',
'marker': name_symbol,
'span': ''
})
def find_title(text):
for title in symbols_data['title']:
matched = re.search(title, text)
if matched is not None:
symbols.append({
'type': 'شرکت',
'marker': matched,
'span': ''
})
symbols = []
symbols_data = {
'name': {'وتجارت', 'وپارس', 'فملی', 'وبصادر', 'کترام', 'فاذر', 'شراز', 'چکاپا', 'آپ', 'لابسا', 'کاما',
'پکویر', 'ثبهساز', 'کلر', 'پترول',
'ورنا', 'لکما', 'بترانس', 'کسرا', 'خفنر', 'ذوب', 'خدیزل', 'شستا', 'شاراک', 'فولاد', 'شپترو',
'وشهر',
'قاسم', 'پالایش', 'خساپا', 'پاسا', 'فسبزوار', 'وبرق', 'غزر', 'سفار', 'نوری', 'زگلدشت', 'ولساپا',
'وغدیر', 'سپید', 'وآیند', 'بکاب', 'وسالت', 'کیسون', 'تپکو', 'بجهرم', 'فروی', 'ختراک', 'همراه',
'غبشهر',
'غنوش', 'کیمیاتک', 'فلوله', 'تفارس-پذیره', 'آرام', 'خفولا', 'بالاس', 'غدشت', 'ثشاهد',
'کتوکا', 'کفپارس', 'زماهان', 'شفن', 'دی ', 'خپارس', 'غصینو', 'مادیرا', 'زاگرس', 'قچار', 'کرمان',
'شکلر', 'شپلی', 'خکرمان', 'کدما', 'طلا', 'خنصیر', 'وهامونح', 'شلرد', 'برکت', 'کمند', 'وسین',
'سجام',
'مفاخر', 'شوینده', 'خکار', 'شیشه01ن', 'افق', 'شپدیس', 'خاور', 'تمحرکه', 'کالا', 'صبا', 'سیمرغ',
'سمگا',
'زگلدشتح', 'خکمک', 'فزرین', 'فنفت', 'رتاپ', 'دارا یکم', 'خگستر', 'وآذر', 'ساذری', 'خودکفا',
'غالبر',
'بزاگرس', 'غشهداب', 'وساپا', 'قنیشا', 'کگاز', 'فولای', 'وپست', 'خودرو', 'شگویا', 'خلنت', 'ثاخت',
'شپنا', 'شتران', 'غگرجی', 'وبملت', 'سیتا', 'گشان', 'وگردش', 'وسدید'},
'title': {'ایران خودرو', 'کویر تایر', 'گروه سرمایه گذاری میراث فرهنگی', 'پارس فولاد سبزوار',
'توسعه وعمران استان کرمان', 'قاسم ایران', 'شرکت ارتباطات سیار ایران',
'لولهوماشینسازیایران', 'پتروشیمی زاگرس', 'مجتمع تولید گوشت مرغ ماهان',
'پتروشیمی پردیس', 'بورس اوراق بهادار تهران', 'بانک قرض الحسنه رسالت',
'سرمایهگذاری رنا', 'صنعتی بهشهر', 'آریان کیمیا تک',
'سرمایهگذاریتوسعهآذربایجان', 'سرامیکهایصنعتیاردکان',
'سرمایهگذاری غدیر', 'توسعه مولد نیروگاهی جهرم', 'بانک آینده',
'خدمات فنی فولاد یزد', 'کارکنان صنعت برق زنجان وقزوی', 'بانک ملت',
'فروشگاههای زنجیره ای افق کوروش',
'سرمایه گذاری تامین اجتماعی', 'کشت و دام گلدشت نمونه اصفهان', 'کود شیمیایی اوره لردگان',
'بانک گردشگری', 'ایرانیاساتایرورابر', 'لیزینگ رایان سایپا', 'آبسال',
'سرمایه گذاری سیمان تامین', 'ماشین سازی نیرو محرکه', 'پارس خودرو', 'گواهی سپرده کالایی شیشه',
'مدیریت صنعت شوینده ت.ص.بهشهر', 'پالایش نفت شیراز', 'تجارت الکترونیک پارسیان',
'مهندسینصیرماشین', 'صندوق س. با درآمد ثابت کمند', 'دشت مرغاب',
'مهندسی ساختمان تاسیسات راه آهن', 'شرکت کیسون', 'گروهصنعتیسدید',
'گسترش سرمایهگذاریایرانخودرو', 'صندوق پالایشی یکم-سهام', 'شاخص بورس',
'ایران خودرو دیزل', 'پالایش نفت اصفهان', 'فراوردههای غذایی وقند چهارمحال', 'صنایع آذرآب',
'آذریت', 'فنرسازیخاور', 'پلی اکریل ایران', 'بینالمللیتوسعهساختمان',
'شیشه و گاز', 'صنایع فولاد آلیاژی یزد', 'معدنی دماوند', 'آسان پرداخت پرشین',
'کمکفنرایندامین', 'سرمایه گذاری صبا تامین', 'تولیدتجهیزاتسنگینهپکو',
'سپید ماکیان', 'صنایع تجهیزات نفت', 'صنعتی مینو', 'پتروشیمی نوری', 'صندوق س.پشتوانه طلای لوتوس',
'بهساز کاشانه تهران', 'ذوب روی اصفهان', 'کلر پارس', 'اقتصادی و خودکفایی آزادگان',
'پتروشیمی آبادان',
'صنعتی زر ماکارون', 'لنت ترمزایران', 'بیمه دی', 'بورس کالای ایران',
'تولیدی و خدمات صنایع نسوز توکا', 'پتروشیمی خلیج فارس',
'ریختهگری تراکتورسازی ایران', 'سایپا', 'زرین معدن آسیا',
'سیمانفارس', 'سیمرغ', 'سرمایه گذاری هامون صبا', 'باما', 'پالایش نفت تهران',
'فولاد مبارکه اصفهان', 'لبنیاتکالبر', 'صنایع مادیران', 'توسعه بین المللی پدیده شاندیز',
'نوشمازندران', 'توسعه فناوری اطلاعات خوارزمی', 'ذوب آهن اصفهان',
'کشت و صنعت شهداب ناب خراسان', 'پتروشیمی شازند', 'سرمایهگذاری سایپا',
'تامین سرمایه خلیج فارس-پذیره', 'کارخانجاتمخابراتیایران', 'مجتمع سیمان غرب آسیا',
'پتروشیمی تندگویان', 'فرآوردههای نسوز پارس', 'گروه اقتصادی کرمان خودرو', 'بانک شهر',
'صندوق واسطه گری مالی یکم', 'بیسکویت گرجی', 'تولیدی کاشی تکسرام',
'بانک دی', 'پتروشیمی فناوران', 'بهمن دیزل', 'بیمه سینا', 'گروه صنایع کاغذ پارس', 'نیروکلر',
'قند نیشابور', 'گروه دارویی برکت', 'پست بانک ایران', 'صنایعجوشکابیزد',
'سرمایه گذاری شاهد', 'صندوق س شاخصی آرام مفید', 'ایرکا پارت صنعت', 'ایران ترانسفو',
'نیروگاه زاگرس کوثر'}
}
find_name(text)
find_title(text)
return symbols
def run(self, input: str = None):
if input is None:
with open('input_example', encoding="utf8") as f:
texts = f.readlines()
for text in texts:
text = text.replace("\u200C", " ")
symbols = self.__find_symbols(text)
events = self.__find_events(text)
reports = self.__find_reports(text)
result = []
for item in symbols:
result.append(item)
for item in events:
result.append(item)
for item in reports:
result.append(item)
print(result)
else:
symbols = self.__find_symbols(input)
events = self.__find_events(input)
reports = self.__find_reports(input)
result = []
for item in symbols:
result.append(item)
for item in events:
result.append(item)
for item in reports:
result.append(item)
print(result)
if __name__ == '__main__':
TextAnalyser().run()