рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдкреЛрд╕реНрдЯ рджреЗрдЦреЗрдВ:
рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЖрдкрдХреЗ рдкреНрд░рд╢реНрди рдХреЛ рдпрд╣рд╛рдВ рдХреЙрдкреА/рдкреЗрд╕реНрдЯ рдХрд░рддрд╛ рд╣реВрдВ:
рдореЗрд░реЗ рдкрд╛рд╕ рдорд╕рд╛рд▓реЗрджрд╛рд░ рдЯреЗрдХреНрд╕реНрдЯ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ nltk рдХреЗ
PorterStemmer
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдЯреЗрдо рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореЗрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ django рдРрдк рд╡реНрдпреВ рдХреЗ рдЕрдВрджрд░ рд╕реНрдЯреЗрдорд┐рдВрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВредрд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдм django рд╡реНрдпреВ рдХреЗ рдЕрдВрджрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЛ рд╕реНрдЯреЗрдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ
IndexError: string index out of range
рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдПPorterStemmer().stem()
рд╕реЗ рдЕрдкрд╡рд╛рдж рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ'oed'
ред рдирддреАрдЬрддрди, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд▓ рд░рд╣рд╛ рд╣реИ:# xkcd_project/search/views.py from nltk.stem.porter import PorterStemmer def get_results(request): s = PorterStemmer() s.stem('oed') return render(request, 'list.html')
рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рддреНрд░реБрдЯрд┐ рдЙрдард╛рддрд╛ рд╣реИ:
Traceback (most recent call last): File "//anaconda/envs/xkcd/lib/python2.7/site-packages/django/core/handlers/exception.py", line 39, in inner response = get_response(request) File "//anaconda/envs/xkcd/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response response = self.process_exception_by_middleware(e, request) File "//anaconda/envs/xkcd/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/Users/jkarimi91/Projects/xkcd_search/xkcd_project/search/views.py", line 15, in get_results s.stem('oed') File "//anaconda/envs/xkcd/lib/python2.7/site-packages/nltk/stem/porter.py", line 665, in stem stem = self._step1b(stem) File "//anaconda/envs/xkcd/lib/python2.7/site-packages/nltk/stem/porter.py", line 376, in _step1b lambda stem: (self._measure(stem) == 1 and File "//anaconda/envs/xkcd/lib/python2.7/site-packages/nltk/stem/porter.py", line 258, in _apply_rule_list if suffix == '*d' and self._ends_double_consonant(word): File "//anaconda/envs/xkcd/lib/python2.7/site-packages/nltk/stem/porter.py", line 214, in _ends_double_consonant word[-1] == word[-2] and IndexError: string index out of range
рдЕрдм рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЬреАрдм рд╣реИ рд╡рд╣ django рдХреЗ рдмрд╛рд╣рд░ рдПрдХ рд╣реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкрд░ рдПрдХ рд╣реА рд╕реНрдЯреЗрдорд░ рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реИ (рдЪрд╛рд╣реЗ рд╡рд╣ рдПрдХ рдЕрд▓рдЧ рдкрд╛рдпрдерди рдлрд╝рд╛рдЗрд▓ рд╣реЛ рдпрд╛ рдПрдХ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдкрд╛рдпрдерди рдХрдВрд╕реЛрд▓ рд╣реЛ) рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ:
# test.py from nltk.stem.porter import PorterStemmer s = PorterStemmer() print s.stem('oed')
рдХреЗ рдмрд╛рдж:
python test.py # successfully prints 'o'
рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдХрд╛рд░рдг рдХреНрдпрд╛ рд╣реИ?
рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ nltk рд╕рдВрд╕реНрдХрд░рдг 3.2.2 рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИред рдореВрд▓ рд░реВрдк рд╕реЗ, рдореИрдВрдиреЗ рдКрдкрд░ рдмрддрд╛рдП рдЕрдиреБрд╕рд╛рд░ ipython рдирд╣реАрдВ рдЕрдЬрдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ test.py
рдЪрд▓рд╛рдпрд╛ред рдХрд┐рд╕реА рддрд░рд╣, рдореИрдВ рдЕрдкрдиреЗ рдореВрд▓ рд╡рд╛рддрд╛рд╡рд░рдг //anaconda/bin/ipython
рдореЗрдВ ipython рд╕реНрдерд╛рдкрдирд╛ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛, рднрд▓реЗ рд╣реА рдореИрдВрдиреЗ рдЕрдкрдиреЗ django рдкреНрд░реЛрдЬреЗрдХреНрдЯ (рд╕рдХреНрд░рд┐рдп) рдЖрднрд╛рд╕реА рд╡рд╛рддрд╛рд╡рд░рдг //anaconda/envs/xkcd/bin/
рдореЗрдВ ipython рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ред рдирддреАрдЬрддрди, ipython рдореЗрд░реЗ рдореВрд▓ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд nltk рдХрд┐рд╕реНрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╕рд╛рде рд╣реА рд╕рдВрд╕реНрдХрд░рдг 3.2.0 рдЪрд▓рд╛рддрд╛ рд╣реИред
рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ PorterStemmer
nltk рд╕рдВрд╕реНрдХрд░рдг 3.2.2 рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ 'oed'
рдХреЛ рд╕реНрдЯреЗрдо рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди nltk рд╕рдВрд╕реНрдХрд░рдг 3.2.0 рдореЗрдВ рдирд╣реАрдВред рдХреНрдпреЛрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдИ рдЕрдВрджрд╛рдЬрд╛ рдирд╣реАрдВ рд╣реИред
рдПрдХ рд╕рд╛рдЗрдб рдиреЛрдЯ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЕрдЬрдЧрд░ 2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореЗрд░рд╛ рдореВрд▓ рд╡рд╛рддрд╛рд╡рд░рдг рдЕрдЬрдЧрд░ 2.7.11 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореЗрд░реЗ django рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рд╡рд╛рддрд╛рд╡рд░рдг рдЕрдЬрдЧрд░ 2.7.13 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
рдЕрд░реЗ,
рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВ (рд╕рдорд╕реНрдпрд╛)ред рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдореИрдВ рдХрднреА рднреА рдЬреАрдердм рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛, рдпрд╣ рдерд╛
рдЧрд▓рддреА рд╕реЗ рд╣реБрдЖред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдореИрдВ рдЕрднреА рдХреНрдпрд╛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реВрдБ!
7 рдЬрдирд╡рд░реА, 2017 11:47 pm рдкрд░, "jkarimi91" [email protected] рд▓рд┐рдЦрд╛ рд╣реИ:
рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ nltk рд╕рдВрд╕реНрдХрд░рдг 3.2.2 рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИред
рдореВрд▓ рд░реВрдк рд╕реЗ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореИрдВрдиреЗ ipython рдирд╣реАрдВ рдЕрдЬрдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ test.py рдЪрд▓рд╛рдпрд╛ред
рдХрд┐рд╕реА рддрд░рд╣, рдореИрдВ рдЕрдкрдиреЗ рд░реВрдЯ рдореЗрдВ ipython рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛
рдкрд░реНрдпрд╛рд╡рд░рдг //рдПрдирд╛рдХреЛрдВрдбрд╛/рдмрд┐рди/рдЖрдИрдкреАрдереЙрди рднрд▓реЗ рд╣реА рдореИрдВрдиреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛
рдореЗрд░реЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдХреНрд░рд┐рдп рдЖрднрд╛рд╕реА рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ ipython
//рдПрдирд╛рдХреЛрдВрдбрд╛/envs/xkcd/bin/. рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, ipython рдЕрд╡рд╢реНрдп рд╣реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реЛрдЧрд╛
nltk рдХрд┐рд╕реНрдд рдореЗрд░реЗ рдореВрд▓ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ рдФрд░ рд╕рд╛рде рд╣реА рдЬреЛ рд╕рдВрд╕реНрдХрд░рдг рдЪрд▓рд╛рддрд╛ рд╣реИ
3.2.0.рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ PorterStemmer рд╕реНрдЯреЗрдо рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ
nltk рд╕рдВрд╕реНрдХрд░рдг 3.2.2 рдореЗрдВ 'oed' рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реЗрдХрд┐рди nltk рд╕рдВрд╕реНрдХрд░рдг 3.2.0 рдореЗрдВ рдирд╣реАрдВред рдореИрдВ рдХреНрдпреЛрдВ
рдХреЛрдИ рдкрддрд╛ рдирд╣реАрдВред-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдереНрд░реЗрдб рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реА рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/nltk/nltk/issues/1581#issuecomment-271100268 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/AVTBBiywlg5c81StFrrcNOsyuF610y9uks5rP9bLgaJpZM4LdV66
.
@ExplodingCabbage рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдЗрд╕ рдореБрджреНрджреЗ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? 3.2
рдЬрд╛рд░реА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВ рдХреЗрд╡рд▓ porter.py
рдкрд░ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ, d8402e3f43ce3b7a3c7ecb45c3b8b1f75c7124e2 рд╣реИред
рдпрд╣ рдХреЛрдб @ jkarimi91 рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
from nltk.stem.porter import PorterStemmer
s = PorterStemmer()
print s.stem('oed')
рдХреБрдЫ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рдж, pdb
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ _apply_rule_list()
рдореЗрдВ porter.py
рднреАрддрд░ рд╕реЗ рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рдбреАрдмрдЧ рдХрд░рдирд╛:
>>> rule
(u'at', u'ate', None)
>>> word
u'o'
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ _ends_double_consonant()
рд╡рд┐рдзрд┐ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ word[-1] == word[-2]
рдФрд░ рдпрд╣ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред
рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рдирд╣реАрдВ рд╣реВрдБ, рддреЛ NLTK 3.2
рдореЗрдВ рд╕рд╛рдкреЗрдХреНрд╖ рд╡рд┐рдзрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдереА:
def _doublec(self, word):
"""doublec(word) is TRUE <=> word ends with a double consonant"""
if len(word) < 2:
return False
if (word[-1] != word[-2]):
return False
return self._cons(word, len(word)-1)
рдЬрд╣рд╛рдБ рддрдХ рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдБ, рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ len(word) < 2
рдЪреЗрдХ рдЧрд╛рдпрдм рд╣реИред
_ends_double_consonant()
рдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрджрд▓рдирд╛ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
def _ends_double_consonant(self, word):
"""Implements condition *d from the paper
Returns True if word ends with a double consonant
"""
if len(word) < 2:
return False
return (
word[-1] == word[-2] and
self._is_consonant(word, len(word)-1)
)
рдУрд╣ред рд╣рд╛рдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ https://github.com/nltk/nltk/commit/d8402e3f43ce3b7a3c7ecb45c3b8b1f75c7124e2 рдореЗрдВ рддреЛрдбрд╝рд╛ :(
рдХреНрдпрд╛ рдкреАрдЖрд░ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдФрд░ рдПрдХ рдлрд┐рдХреНрд╕ рдЖрдЬ рд░рд╛рдд рд╣реЛрдЧрд╛ред
рдзрдиреНрдпрд╡рд╛рдж @jkarimi91 , @fievelk , @ExplodingCabbage
рдирдорд╕реНрддреЗ, рдореБрдЭреЗ рдЖрдЬ рдареАрдХ рдЙрд╕реА рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рд╕реБрдЭрд╛рд╡ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдХреИрд╕реЗ рдареАрдХ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рдХреНрдпрд╛ рдореБрдЭреЗ рдХреЛрдИ рдкреИрдХреЗрдЬ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?
рдирдорд╕реНрддреЗ @santoshbsред рдЖрдк рдпрд╛ рддреЛ рдПрдирдПрд▓рдЯреАрдХреЗ рдХреЗ master
рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдмрдЧ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП 3.2.1
рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рдпрд╣ рдХреЗрд╡рд▓ рд╕рдВрд╕реНрдХрд░рдг 3.2.2
ред
@ExplodingCabbage рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк develop
рд╢рд╛рдЦрд╛ рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ ( master
)ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рднреНрд░рдорд┐рдд рд╣реЛрдирд╛ рдЖрд╕рд╛рди рд╣реИ :)
@fievelk рдЖрдк рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рд╣реИрдВред рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд╣рд╛рдБ: рдЖрдк рдмрдЧ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП develop
рд╢рд╛рдЦрд╛ рдпрд╛ 3.2.1
рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕реВрдЪрдХ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
@fievelk рдЖрдк рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рд╣реИрдВред рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд╣рд╛рдБ: рдЖрдк рдмрдЧ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП
develop
рд╢рд╛рдЦрд╛ рдпрд╛3.2.1
рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред